[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 110

 
Solree:
¿Puede explicarlo con más detalle? Un trozo de código con él, si no te importa :)

Estos son fragmentos de código para establecer el barrido vertical de la subventana del indicador.

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

Esta es la función para fijar las líneas horizontales. La función sólo funciona desde el código del indicador. No funciona desde la biblioteca.

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

Usted se encarga de dibujar por medio de objetos gráficos. Todo es individual.

 
sergeev:

No te sientas intimidado.

Escribí la respuesta a tu pregunta textual "¿Cómo evitar que este EA cierre las órdenes por lotes?

- Si quiere que este EA no cierre las órdenes por lotes, deberá devolverlas del bucle de cierre de órdenes después del primer cierre.

¿Funciona esto?

ves que el retorno ya está en el bucle de cierre de la orden. ¿Dónde buscar el cierre de la primera orden?

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:

se ve que el retorno ya está en el bucle de cierre de la orden. ¿Dónde buscar exactamente el cierre de primer orden?


Esto no es un bucle de orden.

se trata de un reintento obstinado para un pedido.

seguir buscando

 
sergeev:

no se trata de un ciclo de pedidos.

es una sobrecarga de intentos para un solo pedido.

seguir buscando

aquí es donde pongo la vuelta. ¿Verdad?

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

así que puse la vuelta aquí. ¿Verdad?


¿Qué te parece?

es extraño verte en este hilo, alguien con publicaciones en el código base.

 

chicos, como puedo hacer un código para modificar una orden a breakeven.

tenemos que hacer que el stop se arrastre 1 pips hacia el plus y no se vuelva a tocar.

a mi manera

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

parece que el orden debe ser modificado cada vez que la condición es verdadera.

ps.

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


 
sergeev:

¿Qué te parece?

Me parece extraño verte en este hilo, alguien que ha publicado artículos en codebase.

Probado y el resultado - abrió 2 órdenes y no cerró en beneficio y no abrió más.

Así que esta variante no es adecuada.

He publicado mis ideas en la base de código y mis Asesores Expertos han sido escritos a mi orden por programadores experimentados.

Me rindo: no sé dónde poner el retorno, lo he probado en todas partes.

 
Zhunko:

Estos son fragmentos de código para establecer el barrido vertical de la subventana del indicador.

Esta es la función para fijar las líneas horizontales. La función sólo funciona desde el código del indicador. No funciona desde la biblioteca.

Usted se encarga de dibujar por medio de objetos gráficos. Todo es individual.

Gracias, intentaré averiguarlo :)
 
alex12:

Probado y el resultado - abrió 2 órdenes y no cerró en beneficio y no abrió más.

Por lo tanto, esta opción no es adecuada.

Así que vuelve a mi primer post - "...TK incompleto".

 
Puedes decirme si break: (1) debe ir dentro de {..} o (2) debe ir después de }, porque en el ejemplo de la sentencia switch sólo se considera una acción después de case.
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"; }
}