[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 110

 

Ne vous laissez pas intimider.

J'ai écrit la réponse à votre question textuelle "Comment empêcher cet EA de fermer les ordres par lots ?

- Si vous voulez que cet EA ne clôture pas les ordres par lots, vous devez les renvoyer de la boucle de clôture des ordres après la première clôture.

Est-ce que ça marche ?

 
Solree:
Pouvez-vous l'expliquer plus en détail ? Un morceau de code avec, si vous le voulez bien :)

Ce sont des extraits de code pour définir le balayage vertical de la sous-fenêtre de l'indicateur.

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

Il s'agit de la fonction permettant de définir les lignes horizontales. La fonction ne fonctionne qu'à partir du code de l'indicateur. Il ne fonctionne pas à partir de la bibliothèque.

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

Vous vous débrouillez tout seul avec le dessin par objets graphiques. Tout est individuel.

 
sergeev:

Ne vous laissez pas intimider.

J'ai écrit la réponse à votre question textuelle "Comment empêcher cet EA de fermer les ordres par lots ?

- Si vous voulez que cet EA ne clôture pas les ordres par lots, vous devez les renvoyer de la boucle de clôture des ordres après la première clôture.

Est-ce que ça marche ?

vous voyez que le retour est déjà dans la boucle de fermeture de l'ordre. Où chercher la clôture de la première commande ?

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:

ici vous voyez que le retour est déjà debout dans la boucle de fermeture de l'ordre. Où chercher exactement la fermeture de premier ordre ?


Il ne s'agit pas d'une boucle de commande.

il s'agit d'une répétition obstinée pour une commande.

continuez à chercher

 
sergeev:

il ne s'agit pas d'un cycle de commande.

c'est un dépassement obstiné des tentatives pour une seule commande.

continuez à chercher

J'ai mis le retour ici. C'est vrai ?

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

alors j'ai mis le retour ici. C'est vrai ?


Qu'en pensez-vous ?

c'est étrange de vous voir dans ce fil de discussion, quelqu'un qui a des publications dans le codebase.

 

les gars, comment faire un code pour modifier un ordre au seuil de rentabilité.

nous devons faire bouger le stop de 1 pips vers le côté positif et ne plus le toucher.

à ma façon

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

il semble que l'ordre devrait être modifié chaque fois que la condition est vraie.

ps.

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


 
sergeev:

Qu'en pensez-vous ?

Je trouve étrange de vous voir dans ce fil, vous qui avez publié des articles dans Codebase.

J'ai testé et le résultat - j'ai ouvert 2 ordres et je n'ai pas fermé sur le profit et je n'en ai pas ouvert d'autres.

Cette variante ne convient donc pas.

J'ai publié mes idées dans la base de code et mes Expert Advisors ont été écrits à ma demande par des programmeurs expérimentés.

J'abandonne - je ne sais pas où mettre le retour, je l'ai essayé partout.

 
Zhunko:

Ce sont des extraits de code pour définir le balayage vertical de la sous-fenêtre de l'indicateur.

Il s'agit de la fonction permettant de définir les lignes horizontales. La fonction ne fonctionne qu'à partir du code de l'indicateur. Il ne fonctionne pas à partir de la bibliothèque.

Vous vous débrouillez tout seul avec le dessin par objets graphiques. Tout est individuel.

Merci, je vais essayer de trouver une solution :)
 
alex12:

J'ai testé et le résultat - j'ai ouvert 2 ordres et je n'ai pas fermé sur le profit et je n'en ai pas ouvert d'autres.

Cette option ne convient donc pas.

On en revient donc à mon premier message - "...TK incomplet".