[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 110

 
Solree:
もう少し詳しく説明していただけますか?差し支えなければ、それを使ったコードの一部を紹介します :)

これらは、インジケータサブウィンドウの垂直方向の掃引を設定するコードのスニペットです。

  // Для буфера развёртки по вертикали.
  SetIndexBuffer(0, gl_adBufIndicator1);               // Индикаторный буфер для стабилизации и размера изображения графика в дополнительном подокне.
  SetIndexEmptyValue (0, EMPTY_VALUE);                 // Устанавливаем значение пустой величины для линии индикатора.
  SetIndexLabel(0, "VERTICAL SWEEP");                  // Установка имени линии индикатора для отображения информации в окне DataWindow и всплывающей подсказке.
  SetIndexStyle(0, DRAW_NONE, EMPTY, EMPTY, CLR_NONE); // Линию не показываем.
  //==== Устанавливаем развёртку.
  if (st_nWBeginChart <= 0) st_nWBeginChart = 0;
  for (i = st_nWFirstVisiblBar; i >= st_nWBeginChart; i--)
   {// Очищаем буфер от лишних значков для вызова окна свойств индикатора.
    if (i > 0) gl_adBufIndicator2[i] = EMPTY_VALUE;
    // Закрепление вертикальной развёртки графика с помощью индикаторного буфера.
    if (i % 2 == 0) gl_adBufIndicator1[i] = gl_dMaxPositionMark; // Для фиксации верхней координаты дополнительного окна.
    else gl_adBufIndicator1[i] = gl_dMinPositionMark;            // Для фиксации нижней координаты дополнительного окна.
   }
  //==== Расчёт и создание горизонтальных линий разметки.
  if ((gl_dMaxPositionMark - gl_dMinPositionMark) != tmp_dDifferPosMark) // Создаём один раз и отслеживаем через заданный уровень при увеличениях максимальных уровней.
   {// Расчёт и создание горизонтальных линий разметки.
    MakingHorizontalSectoring(AutoStep, Color_LNH, Color_LN0, gl_dMaxPositionMark, gl_dMinPositionMark, Step_LNH, 15, Style_LNH, Width_LNH, st_nWindow, gl_sFullNameObject);
   }

横線を 設定する機能です。この機能はインジケーターコードからしか動作しません。図書館からは使えません。

// 2. Функция расчёта и создания горизонтальных линий разметки.
void MakingHorizontalSectoring(bool   bAutoStep, // Переключатель true/fals = автоматическое/ручное распределение уровней.
                               color  clLine,    // Цвет уровней.
                               color  clLine0,   // Цвет нулевого уровня.
                               double dScaleMAX, // Максимальное значение шкалы.
                               double dScaleMIN, // Минимальное значение шкалы.
                               double dStepH,    // При AutoStp = true/false - количество линий/растояние между линиями.
                               int    nLimiter,  // Ограничение десятичных разрядов в вычислениях порядка амплитуды.
                               int    nStyle,    // Стиль уровней.
                               int    nWidth,    // Толщина уровней.
                               int    nWindow,   // Номер подокна для создания нулевой линий.
                               string sName)     // Имя для индивидуального имени нулевой горизонтальной линии.
 {
  double dStepLN = 0;
  int    nExponent = 0;
  int    i = 0, j = 0, n = 0;
  int    nLowLevel = 0;
  int    nStep = 0;
  int    nUpLevel = 0;
  //----
  if (1000000 * dStepH != 0)
   {
    if (bAutoStep == true) // Автоматическая установка горизонтальных линий по заданному количеству линий по вертикали.
     {
      dStepLN = (dScaleMAX - dScaleMIN) / dStepH; // Считаем шаг в виде числа двойной точности.
      // Вычисление порядка исходного десятичного числа.
      if (dStepLN * MathPow(10, nLimiter) != 0)   // Если число меньше единицы. Проверяем на равенство первому разряду.
       {
        if (dStepLN < 1)
         {
          for (nExponent = 0; nExponent <= nLimiter; nExponent++)
           {
            i = dStepLN * MathPow(10, nExponent);
            if (i >= 1) break;
           }
         }
        if (1 <= dStepLN && dStepLN < 10) nExponent = 0; // Если число между единицей и десятью. Возвращаем нулевой порядок.
        if (dStepLN >= 10)                               // Если число больше или равно единицы. Проверяем на равенство первому разряду.
         {
          for (nExponent = 0; nExponent >= -nLimiter; nExponent--)
           {
            i = dStepLN * MathPow(10, nExponent);
            if (i <= 9) break;
           }
         }
       }
      else nExponent = 0;                                  // Если число с заданной точностью равно нулю.
      nStep = MathRound(dStepLN * MathPow(10, nExponent)); // Преобразум шаг в целое число и окруляем его.
      switch (nStep)                                       // Приводим к стандартному шагу.
       {
        case 1:  nStep =  2; break;
        case 2:  nStep =  2; break;
        case 3:  nStep =  2; break;
        case 4:  nStep =  5; break;
        case 5:  nStep =  5; break;
        case 6:  nStep =  5; break;
        default: nStep = 10;
       }
      dStepLN = nStep * MathPow(10, -nExponent);
      nUpLevel  = (dScaleMAX - MathMod(dScaleMAX, dStepLN)) / dStepLN + 1; // Верхняя граница шкалы для отсчёта шага.
      nLowLevel = (dScaleMIN - MathMod(dScaleMIN, dStepLN)) / dStepLN - 1; // Нижняя граница шкалы для отсчёта шага.
      for (j = nUpLevel; j >= nLowLevel && 1000000 * dStepLN > 0; j--, i++) if (j != 0) SetLevelValue (i, j * dStepLN);
      i++;
      for (n = i; n <= 31; n++) SetLevelValue(n, (j + 1) * dStepLN); // Собираем оставшиеся уровни на последней координате, чтобы не мешались.
     }
    else // Ручная установка горизонтальных линий по заданному шагу по вертикали.
     {
      nUpLevel  = (dScaleMAX - MathMod(dScaleMAX, dStepH)) / dStepH + 1; // Верхняя граница шкалы для отсчёта шага.
      nLowLevel = (dScaleMIN - MathMod(dScaleMIN, dStepH)) / dStepH - 1; // Нижняя граница шкалы для отсчёта шага.
      for (j = nUpLevel; j >= nLowLevel && 1000000 * dStepH > 0; j--, i++) if (j != 0) SetLevelValue(i, j * dStepH);
      i++;
      for (n = i; n <= 31; n++) SetLevelValue(n, (j + 1) * dStepLN); // Собираем оставшиеся уровни на последней коордиеате, чтобы не мешались.
     }
   }
  SetLevelStyle(nStyle, nWidth, clLine);
  // Удаляем горизонтальную нулевую линию.
  ObjectDelete(sName + " HLINE 0");
  // Создаём объект "HLINE 0". Этот объект создаётся всегда.
  ObjectCreate(sName + " HLINE 0", OBJ_HLINE, nWindow, 0, 0);
  ObjectSet   (sName + " HLINE 0", OBJPROP_COLOR, clLine0);
  ObjectSet   (sName + " HLINE 0", OBJPROP_STYLE, nStyle);
  ObjectSet   (sName + " HLINE 0", OBJPROP_WIDTH, nWidth);
 }

グラフィカルなオブジェクトによる描画は自己責任でお願いします。すべてが個である。

 
sergeev:

臆することはない。

このEAが注文を一括で決済しないようにするにはどうしたらいいのか」というご質問に対する回答をそのまま書きました。

- もし、このEAで注文を一括で決済しないようにしたい場合は、最初の決済の後に注文決済ループから注文を戻す必要があります。

これは使えるのか?

を見ると、returnはすでにorder closing loopの中にあることがわかります。最初の注文の締め切りはどこで見るのですか?

int CloseOrder(int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
               while(i1<10)
                   {
                    RefreshRates();
                    if (OrderType()==0)price=Bid;
                    if (OrderType()==1)price=Ask;
                    if (OrderType()>1){OrderDelete(ticket);return(0);}
                    OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
                    err = GetLastError();
                    if (err == 0) break;
                    Print(WindowExpertName(),Symbol(),Error(err),"  при закрытии ордера");
                    Sleep(100);
                    i1++;
                   }
               return(0);
              }
 
alex12:

ここで、returnはすでに注文を閉じるループの中に立っていることがわかります。1次クロージャは具体的にどこを見ればいいのですか?


これはオーダーループではありません。

は、1回の注文で頑なにリトライします。

探し続ける

 
sergeev:

は、オーダーサイクルではありません。

1つの注文に対して、頑固なまでに試行錯誤を繰り返す。

探し続ける

ということで、ここにリターンを入れました。 そうなんですか?

/////////////////////////////////////////////////////////////////////////
int CloseMarket()
   {
    for (int j=0; j<OrdersTotal(); j++)
      {
       OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()<2)
         {
          CloseOrder(OrderTicket(),OrderLots());
          j--;
          return(0);
         }
      }
   }
/////////////////////////////////////////////////////////////////////////////
 
alex12:

ということで、ここにリターンを入れました。 そうなんですか?


いかがでしょうか?

このスレッドに、コードベースで出版物を出している人が全く出てこないのは不思議です。

 

ブレイクイーブン注文を修正するコードを作りたいのですが、どうすればいいですか?

ストップがプラスに1ピップス引きずられ、二度とタッチされないようにする必要があります。

マイウェイ

               switch(Tip)
                  {
                   case 0:
                     if(Ask>op+ts*Point)sl=op+d*Point;
                     break;
                   case 1:
                     if(Bid<op-ts*Point)sl=op-d*Point;
                  }

               OrderModify(Ticket,op,sl,takeprofit,0);

を選択すると、条件が成立するたびに注文が変更されるようです。

ps.

            ts=300,     //-- ts - трейлинг
            d=10;       //-- d - на 'd' пп передвинуть в безубыток     


 
sergeev:

いかがでしょうか?

codebaseで記事を公開している方がこのスレッドにいらっしゃるのは不思議な気がします。

テストしてみた結果、2回注文を出したが利益で決済されず、それ以上注文を出さなかった。

ですから、このバリエーションは適しません。

私は自分のアイデアをコードベースで公開し、Expert Advisorは経験豊富なプログラマーが私の注文に応じて書いてくれています。

あきらめた。どこにリターンを置けばいいのかわからない、あらゆるところで試した。

削除済み  
Zhunko:

これらは、インジケータサブウィンドウの垂直方向の掃引を設定するコードのスニペットです。

横線を設定する機能です。この機能は、インジケータコードからのみ動作します。図書館からは使えません。

グラフィカルなオブジェクトによる描画は自己責任でお願いします。すべてが個である。

ありがとうございます、何とかしてみます :)
 
alex12:

テストしてみた結果、2回注文を出したが利益で決済されず、それ以上注文を出さなかった。

そのため、このオプションは適さない。

つまり、最初の投稿の「...不完全なTK」に戻るわけです。

 
switch文の例ではcaseの後に1つのアクションしか考慮されないので、break:(1)は{..}の中に入れるべきか、(2)は}の後に入れるべきか教えてください。
int a; double b; string c;

switch (a) // --- 1.
{  
   case 1:  { b=Ask+SL_1*Point; c="with stop-loss = "+a; break; }
   case 2:  { b=Ask+SL_2*Point; c="with stop-loss = "+a; break; }
   default: { b=Ask+SL_0*Point; c="with stop-loss = 0"; }
}
switch (a) // --- 2.
{  
   case 1:  { b=Ask+SL_1*Point; c="with stop-loss = "+a; } break;
   case 2:  { b=Ask+SL_2*Point; c="with stop-loss = "+a; } break;
   default: { b=Ask+SL_0*Point; c="with stop-loss = 0"; }
}