[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 110

 

Lassen Sie sich nicht einschüchtern.

Ich schrieb die Antwort auf Ihre wörtliche Frage "Wie kann ich diesen EA dazu bringen, Aufträge nicht in Stapeln zu schließen?

- Wenn Sie möchten, dass dieser EA Aufträge nicht stapelweise schließt, sollten Sie nach dem ersten Abschluss aus der Auftragsschließungsschleife zurückkehren.

Funktioniert das?

 
Solree:
Können Sie das näher erläutern? Ein Stück Code dazu, wenn es Ihnen nichts ausmacht :)

Dies sind Codeschnipsel zum Einstellen der vertikalen Auslenkung des Teilfensters des Indikators.

  // Для буфера развёртки по вертикали.
  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);
   }

Dies ist die Funktion zum Einstellen der horizontalen Linien. Die Funktion funktioniert nur über den Indikatorcode. In der Bibliothek funktioniert es nicht.

// 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);
 }

Beim Zeichnen mit grafischen Objekten sind Sie auf sich allein gestellt. Alles ist individuell.

 
sergeev:

Lassen Sie sich nicht einschüchtern.

Ich schrieb die Antwort auf Ihre wörtliche Frage "Wie kann man diesen EA davon abhalten, Aufträge in Stapeln zu schließen?

- Wenn Sie möchten, dass dieser EA Aufträge nicht stapelweise abschließt, sollten Sie sie nach dem ersten Abschluss aus der Auftragsabschlussschleife zurückgeben.

Funktioniert das?

sehen Sie, dass die Rückgabe bereits in der Auftragsabschlussschleife enthalten ist. Wo ist der erste Bestellabschluss zu suchen?

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:

Hier sehen Sie, dass der Rücklauf bereits in der Auftragsabschlussschleife steht. Wo genau ist der Abschluss erster Ordnung zu suchen?


Es handelt sich nicht um eine Auftragsschleife.

Dies ist ein hartnäckiger Wiederholungsversuch für eine Bestellung.

weitersuchen

 
sergeev:

es handelt sich nicht um einen Auftragszyklus.

Es ist eine hartnäckige Überschreitung für einen einzigen Auftrag.

weitersuchen

Ich habe die Rückgabe hier eingefügt. Richtig?

/////////////////////////////////////////////////////////////////////////
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:

also habe ich die Rückgabe hier eingefügt. Richtig?


Was meinen Sie dazu?

es ist seltsam, Sie in diesem Thread überhaupt zu sehen, jemanden mit Veröffentlichungen in der Codebasis.

 

Leute, wie erstelle ich einen Code, um einen Auftrag auf Break-Even zu ändern.

müssen wir es so einrichten, dass der Stop um 1 Pips ins Plus gezogen und nicht mehr berührt wird.

meine Art

               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);

Es sieht so aus, als sollte die Reihenfolge jedes Mal geändert werden, wenn die Bedingung erfüllt ist.

ps.

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


 
sergeev:

Was meinen Sie dazu?

Ich finde es seltsam, Sie in diesem Thread zu sehen, jemanden, der Artikel in Codebase veröffentlicht hat.

Getestet und das Ergebnis - 2 Aufträge eröffnet und nicht mit Gewinn geschlossen und keine weiteren eröffnet.

Diese Variante ist also nicht geeignet.

Ich habe meine Ideen in der Codebase veröffentlicht und meine Expert Advisors wurden in meinem Auftrag von erfahrenen Programmierern geschrieben.

Ich gebe auf - ich weiß nicht, wohin mit der Rückgabe, ich habe es überall versucht.

 
Zhunko:

Dies sind Codeschnipsel zum Einstellen der vertikalen Auslenkung des Teilfensters des Indikators.

Dies ist die Funktion zum Einstellen der horizontalen Linien. Die Funktion funktioniert nur über den Indikatorcode. In der Bibliothek funktioniert es nicht.

Beim Zeichnen mit grafischen Objekten sind Sie auf sich allein gestellt. Alles ist individuell.

Danke, ich werde versuchen, es herauszufinden :)
 
alex12:

Getestet und das Ergebnis - 2 Aufträge eröffnet und nicht mit Gewinn geschlossen und keine weiteren eröffnet.

Diese Option ist also nicht geeignet.

Es geht also zurück zu meinem ersten Beitrag - "...unvollständige TK".

Grund der Beschwerde: