13ティックトレードシステム開発備忘録

プログラミング開発の覚書として残していきます。
個人的な内容ですので、まとめてません。あしからず。

内容

エントリーリスクを率で制限する部分のプログラム

資産のN%のリスクのロット数を計算する |

【引数】 IN OUT 引数名 説明 【戻値】ロット数
計算した結果、最小ロット数未満になる場合、-1を返す |
 aFunds 資金    余剰証拠金 AccountFreeMargin()   口座残高 AccountBalance() 
aSymbol 通貨ペア  aStopLossPips 損切り値(pips)  aRiskPercent リスク率(%)

double calcLotSizeRiskPercent(double aFunds, string aSymbol, double aStopLossPips, double aRiskPercent)
{
// 取引対象の通貨を1ロット売買した時の1ポイント(pipsではない!)当たりの変動額
double tickValue = MarketInfo(aSymbol, MODE_TICKVALUE);

// tickValueは最小価格単位で計算されるため、3/5桁業者の場合、10倍しないと1pipsにならない
if(MarketInfo(aSymbol, MODE_DIGITS) == 3 || MarketInfo(aSymbol, MODE_DIGITS) == 5) {
}

double riskAmount = aFunds * (aRiskPercent / 100.0);
tickValue *= 10.0;

lotSize = riskAmount / (aStopLossPips * tickValue); //double

double lotStep = MarketInfo(aSymbol, MODE_LOTSTEP);

// ロットステップ単位未満は切り捨て
// 0.123⇒0.12(lotStep=0.01の場合)
// 0.123⇒0.1 (lotStep=0.1の場合)
lotSize = MathFloor(lotSize / lotStep) * lotStep;

// 証拠金ベースの制限
double margin = MarketInfo(aSymbol, MODE_MARGINREQUIRED);

if(margin > 0.0) {
double accountMax = aFunds / margin;

accountMax = MathFloor(accountMax / lotStep) * lotStep;

if(lotSize > accountMax) {
lotSize = accountMax;
}
}

// 最大ロット数、最小ロット数対応
double minLots = MarketInfo(aSymbol, MODE_MINLOT);
double maxLots = MarketInfo(aSymbol, MODE_MAXLOT);

if(lotSize < minLots) {
// 仕掛けようとするロット数が最小単位に満たない場合、
// そのまま仕掛けると過剰リスクになるため、エラーに
lotSize = -1.0;
} else if(lotSize > maxLots) {
lotSize = maxLots;
}

ライン反発エントリー処理の動き

SR_Lineテキストボックスに反発ラインの価格値を設定して、Rv_Buy又はRV_sell ボタンを押すと、
エントリーライン、利確ライン、損切りラインが表示される。
エントリー(発注)後は、エントリー価格から6pipsの値幅で損切りを設定、22pipsの幅で利確ラインが設定される。

   //リバースブレイク買いボタン処理
      if(sparam == "Rv_Buy")
        {
         if(ObjectGetInteger(0, sparam, OBJPROP_STATE) == true)
           {
            Alert("リバースブブレイク買いボタンが押されました");
            ObjectSetInteger(0, sparam, OBJPROP_STATE, 0); //ボタンを押されていない状態に戻す
            ChartRedraw();
           }

         //トレード手法のタイプ設定
         Original_Type = Rv_Buy;

         //ライン作成処理
         //    line_create();

         //ターゲット価格を設定していない(値が0)の場合
         if(RN_SR <= 0)
           {

            //リバーサルブレークライン(ライトグリーンの破線)を現在の価格より3ピップス下に作成
            ObjectCreate("Horizontal Line LineforBreak_EA", OBJ_HLINE, 0, Time[0],  Close[0] - 3 * PIP);
            //リミットライン(青の実線)を現在の高値より20ピップス上に作成
            ObjectCreate("Horizontal Line lmLine", OBJ_HLINE, 0, Time[0], High[0] + 20 * PIP);
            //ストップライン(赤の実線)を現在の安値より5ピップス下に作成
            //ポジションがない(0)の場合に作成
            if(pos == 0)
              {

               //ストップライン(赤の実線)を現在の安値より5ピップス下に作成
               ObjectCreate("Horizontal Line slLine", OBJ_HLINE, 0, Time[0], Low[0] - 5 * PIP);
              }
           }
         else
           {
            //リバーサルブレークライン(ライトグリーンの破線)を設定 の価格より設定ピップス上に作成
            ObjectCreate("Horizontal Line LineforBreak_EA", OBJ_HLINE, 0, Time[0],  RN_SR + tolerance * PIP);
            //リミットライン(青の実線)を現在の高値より22ピップス上に作成
            ObjectCreate("Horizontal Line lmLine", OBJ_HLINE, 0, Time[0], RN_SR + 22 * PIP);
            //ストップライン(赤の実線)を現在の安値より6ピップス下に作成
            //ポジションがない(0)の場合に作成
            if(pos == 0)
              {
               ObjectCreate("Horizontal Line slLine", OBJ_HLINE, 0, Time[0], RN_SR - 6 * PIP);
              }
           }

         //ナンピンエントリー可にする為、前のフラッグを初期化
         previousFlag = 0;

        }

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です