Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 168

 

Por favor, dígame qué estoy haciendo mal. Estoy tratando de hacer un indicador simple:


  {

   int limit,i;
   double last;
   int counted_bars = IndicatorCounted();
   //---- check for possible errors
   if (counted_bars < 0) 
       return(-1);
   //---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(i=limit; i>=0; i--)
   {
      double OptClose = Close[i]*10000;
      if (MathMod(OptClose,step1)==0)
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
      else
      Buffer0[i] = last;
   }

//----
   return(0);
  }
//+------------------------------------------------------------------+

Funciona en la ventana del gráfico, pero cuando intento probarlo en el Asesor Experto, o dibuja lo que sea o "no hay pasos".

 
Virtuon:

Por favor, dígame qué estoy haciendo mal. Estoy tratando de hacer un indicador simple:

Funciona en la ventana del gráfico, pero cuando intento probarlo en el Asesor Experto, o dibuja lo que sea o "no hay pasos".

      if (MathMod(OptClose,step1)==0)
         Buffer0[i] = Close[i];
      else
         Buffer0[i] = Buffer0[i+1];
 
PapaYozh:

Lo probé. Incluso en la ventana no funciona así. Aparentemente hay algún tipo de truco aquí. Ahora funciona así, pero es terriblemente lento:
 for(i=WindowBarsPerChart(); i>=0; i--)
   {
      double OptClose = Close[i]*10000;
      if (MathMod(i+step1,step1)==0)
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
      else
      Buffer0[i] = last;
      Comment(Buffer0[WindowBarsPerChart()]," ",Buffer0[0]);
   }
Esto es con la comprobación de recálculo de la última barra desactivada.
 

¡Hola, gurús de la programación MQL4! Por favor, indíqueme cómo es posible:

Un trozo de código de programa:

   LogAdd("Начинаю вычисления переменных для текущего тика ... ");  
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);           
      LogAdd("Выбираю ордер с тикетом: " + i); 
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd("Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + ".");
      }
      if (OrderType() == OP_BUY) {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0); 
         LogAdd("Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + ".");  
      }  
      if (OrderType() == OP_SELL) {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0);
         LogAdd("Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + ".");
      }  
      if (OrderType() == OP_SELLSTOP) {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd("Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + ".");
      }  
      if (OrderType() == OP_BUYSTOP) {
         buyOpnPrice = OrderOpenPrice();
         LogAdd("Ордер является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + ".");
      }  
   }
   LogAdd("Вычисления переменных для текущего тика завершены."); 

Un trozo de tronco para esta sección:

2013.10.2 15:59:0 - Начинаю вычисления переменных для текущего тика ... 
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 5
2013.10.2 15:59:0 - Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - 1.35250000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 4
2013.10.2 15:59:0 - Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - 1380728738, currentTicket - 93537240, currentStopLoss - 0.00000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 1, buyOpnPrice - 1.35620000, lotsSumBuy - 0.06000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 1, sellOpnPrice - 1.35250000, lotsSumSell - 0.01000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 3
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 2, sellOpnPrice - 1.35250000, lotsSumSell - 0.04000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 2
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 2, buyOpnPrice - 1.35620000, lotsSumBuy - 0.07000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 3, sellOpnPrice - 1.35250000, lotsSumSell - 0.05000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 1
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 3, buyOpnPrice - 1.35620000, lotsSumBuy - 0.08000000.
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 4, sellOpnPrice - 1.35250000, lotsSumSell - 0.06000000.
2013.10.2 15:59:0 - Выбираю ордер с тикетом: 0
2013.10.2 15:59:0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 5, sellOpnPrice - 1.35250000, lotsSumSell - 0.07000000.
2013.10.2 15:59:0 - Вычисления переменных для текущего тика завершены.
La cuestión es cómo para la misma orden las condiciones podrían haber funcionado:
      if (OrderType() == OP_BUY) {         
          ...
      }  
      if (OrderType() == OP_SELL) {
          ...
      } 

No entiendo algo, pero luego lógicamente resulta que para esta orden:

OP_BUY == OP_SELL
Básicamente no me importa por qué ocurre esto, lo que importa es que sellCntr++ y buyCntr++ se ejecuten sin ambigüedad para un determinado tipo de orden abierta, ¿me ayudas a solucionarlo?
 
Mepkypuu:

¡Hola, gurús de la programación MQL4! Por favor, indíqueme cómo es posible:

Un trozo de código de programa:

Un trozo de tronco para esta sección:

La cuestión es cómo para la misma orden las condiciones podrían haber funcionado:

No entiendo algo, pero luego lógicamente resulta que para esta orden:

Básicamente no me importa por qué ocurre esto, lo que importa es que sellCntr++ y buyCntr++ se ejecuten sin ambigüedad para un determinado tipo de orden abierta, ¿me ayudan a solucionarlo?
¿Cómo sabes que es el mismo orden? No se imprime el billete ;).... Estoy seguro de que, al hacer la búsqueda, hay un exceso de pedidos ;) - El error inducido viene de ahí.
TrailingByShadows(OrderTicket(), Period(), 11, 0);  ?????????????????????????????? Вы при трале разве ордера не перебираете ?????????? 
 
VladislavVG:
¿Cómo puede estar seguro de que es el mismo orden? No se imprime el billete ;).... Estoy seguro de que, cuando se hace el arrastre, el orden se sobremuestrea ;) - El error inducido viene de ahí.

Lógicamente, ¿para qué voy a recorrer los pedidos de la red de arrastre si ya sé cuál es el pedido concreto que tengo que arrastrar? No hay fuerza bruta, aquí está el código:

void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent) {  
   int i;
   double new_extremum;

   if ((bars_n<1) || (indent<0) || (ticket==0) || ((tmfrm!=1) && (tmfrm!=5) && (tmfrm!=15) && (tmfrm!=30) && (tmfrm!=60) && (tmfrm!=240) && (tmfrm!=1440) && (tmfrm!=10080) && (tmfrm!=43200)) || (!OrderSelect(ticket,SELECT_BY_TICKET))) {
      Print("Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
   } 
   if (OrderType()==OP_BUY) {
      for(i = 1; i <= bars_n; i++) {
         if (i == 1) new_extremum = iLow(Symbol(), tmfrm, i); 
         else if (new_extremum > iLow(Symbol(), tmfrm, i)) new_extremum = iLow(Symbol(), tmfrm, i);
      }
      if(((new_extremum - indent * Point) > OrderStopLoss() + 1.0 * Point) || (OrderStopLoss() == 0))
      if((new_extremum - indent * Point) > OrderOpenPrice())
      if(new_extremum - indent * Point < Bid - MarketInfo(Symbol(), MODE_STOPLEVEL) * Point)
      if(AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum - indent * Point, OrderTakeProfit(), OrderExpiration());
   }
   
   if (OrderType() == OP_SELL) {
      for(i = 1; i <= bars_n; i++) {
         if (i == 1) new_extremum = iHigh(Symbol(), tmfrm, i); 
         else if (new_extremum < iHigh(Symbol(), tmfrm, i)) new_extremum = iHigh(Symbol(), tmfrm, i);
      }
      if (((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point) < OrderStopLoss() - 1.0 * Point) || (OrderStopLoss() == 0)) 
      if ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point) < OrderOpenPrice())                          
      if ((new_extremum + (indent + MarketInfo(Symbol(),MODE_SPREAD)) * Point > Ask + MarketInfo(Symbol(),MODE_STOPLEVEL) * Point)) 
      if (AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum + (indent + MarketInfo(Symbol(), MODE_SPREAD)) * Point, OrderTakeProfit(), OrderExpiration());
   }      
}
PD: Por cierto, este problema sólo se produce en condiciones reales, es decir, no se reproduce en el probador.
 
Estimados programadores, podrían decirme por qué al reiniciar mi ordenador de nuevo, al abrir el terminal en lugar de un gráfico normal, veía una ventana gris, y las posiciones abiertas, el asesor, los indicadores desaparecían, pero al abrir un nuevo gráfico, las posiciones aparecían, pero no había asesor e indicadores, tuve que instalarlos de nuevo. ¿Qué tiene esto que ver? He tenido que instalarlos de nuevo. Gracias.
 

Este problema ha surgido. El comprobador de estrategias sólo funciona una vez. Más concretamente, la prueba de visualización se activa una vez, y las siguientes veces que se pulsa el botón de "inicio", la casilla de "visualización" se restablece y no ocurre nada (más o menos no ocurre). ¿Cómo se puede vencer esto?

 
Mepkypuu:

Lógicamente, ¿para qué voy a recorrer los pedidos de la red de arrastre si ya sé cuál es el pedido concreto que tengo que arrastrar? No hay fuerza bruta, aquí está el código:

PD: Por cierto, este problema sólo se produce en condiciones reales, es decir, no se reproduce en el probador.


Intenta ejecutarlo en esta variante:

   LogAdd("Начинаю вычисления переменных для текущего тика ... ");  
   for (int i = OrdersTotal()-1; i >= 0; i--) 
   {
      if(!OrderSelect(i, SELECT_BY_POS)) continue;           
      int OrdType=OrderType() ;
      int OrdTckt = OrderTicket(); 
      LogAdd("Выбираю ордер ( "+i+" ) с тикетом: " + OrdTckt); 
      if ((OrderOpenTime() > opnTime) && (OrdType == OP_BUY) || (OrdType == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd("Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + ".");
      }
      if (OrdType == OP_BUY) 
      {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0); 
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + ".");  
      }  
      if (OrdType== OP_SELL) 
      {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period(), 11, 0);
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + ".");
      }  
      if (OrderType() == OP_SELLSTOP) 
      {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + ".");
      }  
      if (OrderType() == OP_BUYSTOP) 
      {
         buyOpnPrice = OrderOpenPrice();
         LogAdd("Ордер "+OrdTckt  <-> OrderTicket()+" является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + ".");
      }  
   }
   LogAdd("Вычисления переменных для текущего тика завершены."); 

A ver qué dice el registro.

 
¿Es posible establecer la sangría de forma programada, no a través de la plantilla? Puedo obtener el tamaño de la sangría a través de
WindowBarsPerChart() - WindowFirstVisibleBar() - 2;

puede, sino cómo exponerlo.

Añadido

Parece que se puede hacer de forma programada a través de plantillas. Crear una plantilla con un indicador, con _lread kernel32.dll leer shift_size valor, con _lwrite escribir allí un número de 10 a 50, como tales rangos pueden aceptar este parámetro, a continuación, a través de InternalMsg cargar una plantilla. Pero no sabemos si es el 33511 o el 35511. En WinUser32.mqh, es la primera opción, mientras que en el foro es la segunda. La pregunta debe dirigirse a Junko. Es mucho más fácil en MT5. CHART_SHIFT_SIZE está disponible allí a través de ChartSetString() y ChartGetString() desde cualquier punto del código... ¿Tal vez haya otras opciones en MT4? Aunque es una pregunta tonta...

Razón de la queja: