¿Cómo puedo saber el tipo de parámetro de entrada?
el propio compilador sustituye los tipos en el momento de la llamada a la función de plantilla, si dicha llamada no estaba todavía en el código, entonces el compilador creará otra copia de la función y establecerá los tipos por sí mismo - bueno, como si lógicamente - una plantilla
si la pregunta es sobre cómo definir el tipo en dicha función, utilice
typename
UPD: añadido al ejemplo anterior el parámetro tipo impresoras:
//--- buffers (массивы под буферы индикатора)//--------------------------------------------------------------------double RSI[]; // буфер под RSI//--------------------------------------------------------------------double MAr1_fast[]; // буфер под быструю МАdouble MAr2_slow[]; // буфер под медленную МАdouble MAr2_slowColor[]; // буфер под цвета медленной МА//--------------------------------------------------------------------double MAr3_slow_glob[]; // буфер под глобальную медленную МАdouble MAr3_slow_globColor[]; // буфер под цвета глобальной медленной МА//--------------------------------------------------------------------
Esencialmente: el indicador dibuja 4 líneas: las dos primeras son de un solo color, las dos siguientes son bicolores (cambian de color en las curvas).
El bicolor se debe a la forma de dibujar DRAW_COLOR_LINE.
Pregunta: la primera línea (búferes 2 y 3 en el código anterior) se dibuja perfectamente y todo el código escrito para ella en OnInit funciona; segunda línea aparece por alguna razón, por ejemplo la línea no funciona:
PlotIndexSetString (4, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Es decir, en lugar del texto que puse en la ventana de datos, sólo aparece el nombre del indicador en lugar del buffer. Aunque la propia línea está trazada, y es, como debe ser, multicolor. Creo que el truco está en el cambio de numeración? Por ejemplo, no estoy seguro de por qué en la parte superior del código, cuando declaro la última línea con la directiva #property, el índice debería ser 4, y no 5, ya que antes se han utilizado 4 buffers. ¿Existe alguna relación entre la numeración de líneas al declarar con #property y la numeración de buffers al enlazar con arrays en OnInit?
Por favor, indique qué es lo que está mal en el código anterior. Quizá alguien pueda encontrar un ejemplo de indicador en el que se dibujen al menos dos líneas utilizando el método de dibujo DRAW_COLOR_LINE....
Otra pregunta relacionada: ¿cómo se unen los topes de las líneas de colores? Es decir, ¿cómo sabe el código compilado que si pongo un valor en un búfer de color, este color debe utilizarse para colorear una línea de algún otro búfer?
Por la tarde. Me encuentro con algo extraño al escribir un indicador en MQL5 (indicador en una subventana separada, 4 líneas).
Las descripciones de los búferes iniciales son las siguientes:
Siguiente en OnInit:
Esencialmente: el indicador dibuja 4 líneas: las dos primeras son de un solo color, las dos siguientes son bicolores (cambian de color en las curvas).
El bicolor se debe a la forma de dibujar DRAW_COLOR_LINE.
Pregunta: la primera línea (búferes 2 y 3 en el código anterior) se dibuja perfectamente y todo el código escrito para ella en OnInit funciona; segunda línea aparece por alguna razón, por ejemplo la línea no funciona:
Es decir, en lugar del texto que puse en la ventana de datos, sólo aparece el nombre del indicador en lugar del buffer. Aunque la propia línea está trazada, y es, como debe ser, multicolor. Creo que el truco está en el cambio de numeración? Por ejemplo, no estoy seguro de por qué en la parte superior del código, cuando declaro la última línea con la directiva #property, el índice debería ser 4, y no 5, ya que antes se han utilizado 4 buffers. ¿Existe alguna relación entre la numeración de líneas al declarar con #property y la numeración de buffers al enlazar con arrays en OnInit?
Por favor, indíqueme qué es lo que falla en el código anterior. Quizá alguien pueda encontrar un ejemplo de indicador en el que se dibujen al menos dos líneas utilizando el método de dibujo DRAW_COLOR_LINE....
Otra pregunta relacionada: ¿cómo se unen los topes de las líneas de colores? Es decir, ¿cómo sabe el código compilado que si pongo un valor en un búfer de color, este color debe utilizarse para colorear una línea de algún otro búfer?
Las asignaciones se numeran de forma diferente a los búferes.
PlotIndexSetString (3, PLOT_LABEL, "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Buen día. Quiero escribir un EA basado en la medición del ángulo de inclinación de una media móvil (o mejor un conjunto de ellas, concretamente la Alligator), de forma que el EA dé una alerta ante un fuerte impulso del precio, preferiblemente con un pequeño retardo. Por favor, aconseje cómo medir el ángulo de la MA o "decirle al EA" que el pulso se produjo. Tal vez ya se conozcan formas de hacerlo. ¿O, por ejemplo, un indicador gratuito basado en el cálculo de impulsos?
Escribí una función para encontrar el número de barra de un fractal de 3 barras. En el gráfico en línea parece encontrarlo correctamente. Pero durante las pruebas visuales en el probador miente. ¿Puede alguno de los profesionales echar un vistazo al código y encontrar algún error?
Se lo agradecería mucho.
//+----------------------------------------------------------------------------+//| Описание : Возвращает номер бара трёхбарного фарактала по его номеру. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" или NULL - текущий символ) |//| tf - таймфрейм ( 0 - текущий ТФ) |//| nf - номер экстремума ( 0 - последний) |//+----------------------------------------------------------------------------+int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
if(sy=="" || sy=="0") sy=Symbol();
int nlext=0,k=iBars(sy,tf);
nlext=0;
if(mode==MODE_UPPER)
{
for (int i=2; i<=k; i++)
{
if(High[i]>High[i+1] && High[i]>High[i-1])
{
nlext++;
if(nlext>ne) return(i);
}
}
}
if(mode==MODE_LOWER)
{
for (i=2; i<=k; i++)
{
if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
{
nlext++;
if(nlext>ne)
{
//Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);return(i);
}
}
}
}
Print("Бар локального экстремума не найден");
return(-1);
}
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
Buenas tardes. ¿QUÉ CÓDIGO DEBO AÑADIR PARA QUE EL INDICADOR DEJE DE FUNCIONAR EN EL PROBADOR DESPUÉS DE UN MES? ES DECIR, ¡ESCRIBÍ TODO BIEN! PERO CUANDO HAGO UN BACKTEST VUELVE A FUNCIONAR. (mgl4)
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
datetime data=D'2020.09.16 20:07'; // Time Blockif(TimeCurrent()>data)
{
Print("Демонстрационный период закончился, покупайте индикатор :)");
Alert("Демонстрационный период закончился, покупайте индикатор :)");
return(INIT_FAILED);
}
if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
Comment("Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :) Демонстрационный период закончился, покупайте индикатор :)");
return(0);
}
Buenas tardes. ¿QUÉ CÓDIGO DEBO AÑADIR PARA QUE EL INDICADOR DEJE DE FUNCIONAR EN EL PROBADOR DESPUÉS DE UN MES? ES DECIR, ¡ESCRIBÍ TODO BIEN! PERO CUANDO HAGO UN BACKTEST VUELVE A FUNCIONAR. (mgl4)
Es necesario escribir este código no en OnInit, sino en OnTick().
¿Cómo puedo saber el tipo de parámetro de entrada?
el propio compilador sustituye los tipos en el momento de la llamada a la función de plantilla, si dicha llamada no estaba todavía en el código, entonces el compilador creará otra copia de la función y establecerá los tipos por sí mismo - bueno, como si lógicamente - una plantilla
si la pregunta es sobre cómo definir el tipo en dicha función, utilice
typenameUPD: añadido al ejemplo anterior el parámetro tipo impresoras:
2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)
2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typename = int
2020.09.16 18:58:21.681 tst (EURUSD,M5) 5
2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)
2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = double
2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = double
2020.09.16 18:58:21.681 tst (EURUSD,M5) 40
UPD: añadido__FUNCSIG__ a este ejemplo
Por la tarde.
Me encuentro con algo extraño al escribir un indicador en MQL5 (indicador en una subventana separada, 4 líneas).
Las descripciones de los búferes iniciales son las siguientes:
Siguiente en OnInit:
Esencialmente: el indicador dibuja 4 líneas: las dos primeras son de un solo color, las dos siguientes son bicolores (cambian de color en las curvas).
El bicolor se debe a la forma de dibujar DRAW_COLOR_LINE.
Pregunta: la primera línea (búferes 2 y 3 en el código anterior) se dibuja perfectamente y todo el código escrito para ella en OnInit funciona;
Es decir, en lugar del texto que puse en la ventana de datos, sólo aparece el nombre del indicador en lugar del buffer. Aunque la propia línea está trazada, y es, como debe ser, multicolor.segunda línea aparece por alguna razón, por ejemplo la línea no funciona:
Creo que el truco está en el cambio de numeración? Por ejemplo, no estoy seguro de por qué en la parte superior del código, cuando declaro la última línea con la directiva #property, el índice debería ser 4, y no 5, ya que antes se han utilizado 4 buffers. ¿Existe alguna relación entre la numeración de líneas al declarar con #property y la numeración de buffers al enlazar con arrays en OnInit?
Por favor, indique qué es lo que está mal en el código anterior. Quizá alguien pueda encontrar un ejemplo de indicador en el que se dibujen al menos dos líneas utilizando el método de dibujo DRAW_COLOR_LINE....
Otra pregunta relacionada: ¿cómo se unen los topes de las líneas de colores? Es decir, ¿cómo sabe el código compilado que si pongo un valor en un búfer de color, este color debe utilizarse para colorear una línea de algún otro búfer?
Por la tarde.
Me encuentro con algo extraño al escribir un indicador en MQL5 (indicador en una subventana separada, 4 líneas).
Las descripciones de los búferes iniciales son las siguientes:
Siguiente en OnInit:
Esencialmente: el indicador dibuja 4 líneas: las dos primeras son de un solo color, las dos siguientes son bicolores (cambian de color en las curvas).
El bicolor se debe a la forma de dibujar DRAW_COLOR_LINE.
Pregunta: la primera línea (búferes 2 y 3 en el código anterior) se dibuja perfectamente y todo el código escrito para ella en OnInit funciona;
Es decir, en lugar del texto que puse en la ventana de datos, sólo aparece el nombre del indicador en lugar del buffer. Aunque la propia línea está trazada, y es, como debe ser, multicolor.segunda línea aparece por alguna razón, por ejemplo la línea no funciona:
Creo que el truco está en el cambio de numeración? Por ejemplo, no estoy seguro de por qué en la parte superior del código, cuando declaro la última línea con la directiva #property, el índice debería ser 4, y no 5, ya que antes se han utilizado 4 buffers. ¿Existe alguna relación entre la numeración de líneas al declarar con #property y la numeración de buffers al enlazar con arrays en OnInit?
Por favor, indíqueme qué es lo que falla en el código anterior. Quizá alguien pueda encontrar un ejemplo de indicador en el que se dibujen al menos dos líneas utilizando el método de dibujo DRAW_COLOR_LINE....
Otra pregunta relacionada: ¿cómo se unen los topes de las líneas de colores? Es decir, ¿cómo sabe el código compilado que si pongo un valor en un búfer de color, este color debe utilizarse para colorear una línea de algún otro búfer?
Las asignaciones se numeran de forma diferente a los búferes.
Esto debería funcionar.
¡Buenas tardes a todos!
Hice una función para modificar el stoploss. Pero cuando funciona da EURUSD,H1: OrderModify error 130.
Y el precio está muy lejos del lugar donde se debe fijar el stoploss.
Esta es la función:
void open_bu(string walpa, int op) { bool err; int spred=(int)MarketInfo(walpa,MODE_SPREAD); double point=MarketInfo(walpa,MODE_POINT); int digits=(int)MarketInfo(walpa,MODE_DIGITS); for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa) { if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) ) { err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0)) { Print(walpa," ",spred," ",point," ",digits," ",NormalizeDouble(OrderOpenPrice()-spred*point, digits)); err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE); if(!err) error(GetLastError()); } } } return; }Escribí una función para encontrar el número de barra de un fractal de 3 barras. En el gráfico en línea parece encontrarlo correctamente. Pero durante las pruebas visuales en el probador miente. ¿Puede alguno de los profesionales echar un vistazo al código y encontrar algún error?
Se lo agradecería mucho.
Buenas tardes. ¿QUÉ CÓDIGO DEBO AÑADIR PARA QUE EL INDICADOR DEJE DE FUNCIONAR EN EL PROBADOR DESPUÉS DE UN MES? ES DECIR, ¡ESCRIBÍ TODO BIEN! PERO CUANDO HAGO UN BACKTEST VUELVE A FUNCIONAR. (mgl4)
¡Hola!
Quería poner una condición en el ciclo de cierre de órdenes enel día de apertura, para que las órdenes que se abrieron el viernes no se cerraran.
Buenas tardes. ¿QUÉ CÓDIGO DEBO AÑADIR PARA QUE EL INDICADOR DEJE DE FUNCIONAR EN EL PROBADOR DESPUÉS DE UN MES? ES DECIR, ¡ESCRIBÍ TODO BIEN! PERO CUANDO HAGO UN BACKTEST VUELVE A FUNCIONAR. (mgl4)
Es necesario escribir este código no en OnInit, sino en OnTick().
¡Hola!
Quería poner una condición en el ciclo de cierre de pedidos enel día de apertura de los mismos, para que no se cerraran los abiertos el viernes.
Inténtalo de esta manera:
for(int is=OrdersTotal()-1; is>=0; is--) { if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES)) { if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) { if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error, " ",Symbol()); } else error=0; } else Print("NoMagic ", OrderMagicNumber()); // for Debug } else Print( "Error when order select ", GetLastError()); }