Así pues, existe una función para determinar la hora de apertura de una barra (incluso si la barra está en el futuro)
//+---------------------------------------------------------------------------+//| Получение точного времени открытия |//|Input: |//|1) Время, которое необходимо округлить до ближайшего времени открытия бара |//|2) Переменная для вывода результата |//|3) Период ТФ |//|4) Отклонение влево-вправо |//|Возврат: количество элементов(1), 0 если не скопировано, (-1) если ошибка |//+---------------------------------------------------------------------------+int GetSingleBarOpenTime(datetime Time,datetime &Output,ENUM_TIMEFRAMES nPeriod,int Shift=0) export
{
datetime OpenTime[1];
int Count=0;
// если бар существует то используем стандартную процедуру поиска времени открытияif(Time<=TimeCurrent() && Shift==0)
{
Count=CopyTime(Symbol(),nPeriod,Time,1,OpenTime);
if(Count==0)
{
Print("GetCorrectOpenTime CopyTime elements=0");
return(0);
}
elseif(Count<0)
{
Print("GetCorrectOpenTime error "+(string)GetLastError());
return(Count);
}
else
{
Output=OpenTime[0];
return(Count);
}
}
//если бар находится в будущем то используем следующую процедуруelse
{
MqlDateTime sTime;
// NumOfUnits - количество стандартных единицint NumOfUnits=0;
int ToRnd;
TimeToStruct(Time,sTime);
//Единица измерения(1-минута, 2 - час, 3 - день, 4 - неделя(но используются дни), 5 - месяц)short Unit=0;
//в зависимости от ТФ инициализируются параметрыswitch(nPeriod)
{
casePERIOD_M1: {Unit=1;NumOfUnits=1;break;}
casePERIOD_M2: {Unit=1;NumOfUnits=2;break;}
casePERIOD_M3: {Unit=1;NumOfUnits=3;break;}
casePERIOD_M4: {Unit=1;NumOfUnits=4;break;}
casePERIOD_M5: {Unit=1;NumOfUnits=5;break;}
casePERIOD_M6: {Unit=1;NumOfUnits=6;break;}
casePERIOD_M10: {Unit=1;NumOfUnits=10;break;}
casePERIOD_M12: {Unit=1;NumOfUnits=12;break;}
casePERIOD_M15: {Unit=1;NumOfUnits=15;break;}
casePERIOD_M20: {Unit=1;NumOfUnits=20;break;}
casePERIOD_M30: {Unit=1;NumOfUnits=30;break;}
casePERIOD_H1: {Unit=2;NumOfUnits=1;break;}
casePERIOD_H2: {Unit=2;NumOfUnits=2;break;}
casePERIOD_H3: {Unit=2;NumOfUnits=3;break;}
casePERIOD_H4: {Unit=2;NumOfUnits=4;break;}
casePERIOD_H6: {Unit=2;NumOfUnits=6;break;}
casePERIOD_H8: {Unit=2;NumOfUnits=8;break;}
casePERIOD_H12: {Unit=2;NumOfUnits=12;break;}
casePERIOD_D1: {Unit=3;NumOfUnits=1;break;}
casePERIOD_W1: {Unit=4;NumOfUnits=7;break;}
casePERIOD_MN1: {Unit=5;NumOfUnits=1;break;}
default: {Print("Period is unknown"); break;}
}
// Если ТФ - минуты, тоif(Unit==1)
{
sTime.sec=0;
//Остаток от деления
ToRnd=(int)fmod(sTime.min,NumOfUnits);
Time=StructToTime(sTime);
// Округление до ближайшего времени открытия(пример: если сейчас 14:25, и тф 2min, то ближайщее время открытия бара - 14:24)
Time-=(ToRnd*60);
Time+=(NumOfUnits*Shift*60);
}
elseif(Unit==2)
{
sTime.sec=0;
sTime.min=0;
ToRnd=(int)fmod(sTime.hour,NumOfUnits);
Time=StructToTime(sTime);
Time-=(ToRnd*60*60);
Time+=(NumOfUnits*Shift*60*60);
}
elseif(Unit==3)
{
sTime.hour=0;
sTime.min=0;
sTime.sec=0;
ToRnd=(int)fmod(sTime.day,NumOfUnits);
Time=StructToTime(sTime);
int hds;
hds=sTime.day_of_week;
if (hds==0) hds=7;
hds=floor((hds+Shift)/7)*2;
int ti=Shift+hds;
while (hds>7)
{
hds=(floor(hds/7))*2;
ti+=hds;
}
Print(ti);
Time-=(ToRnd*60*60*24);
Time+=(NumOfUnits*Shift*60*60*24);
}
elseif(Unit==4)
{
sTime.hour=0;
sTime.min=0;
sTime.sec=0;
ToRnd=(int)fmod(sTime.day,NumOfUnits);
Time=StructToTime(sTime);
Time-=(ToRnd*60*60*24);
Time+=(NumOfUnits*Shift*60*60*24);
}
elseif(Unit==5)
{
sTime.sec=0;
sTime.min=0;
sTime.hour=0;
sTime.day=1;
sTime.mon=sTime.mon-(int)fmod(sTime.mon,NumOfUnits)+(NumOfUnits*Shift);
while(sTime.mon<1)
{
sTime.year--;
sTime.mon=12+sTime.mon;
}
while(sTime.mon>12)
{
sTime.year++;
sTime.mon=sTime.mon-12;
}
if(sTime.sec<0)
Print("GetSingleBarOpenTime seconds error");
if(sTime.min<0)
Print("GetSingleBarOpenTime minutes error");
if(sTime.hour<0)
Print("GetSingleBarOpenTime hours error");
if(sTime.day<1)
Print("GetSingleBarOpenTime days error");
if(sTime.mon<0)
Print("GetSingleBarOpenTime months error");
if(sTime.year<1970)
Print("Year < 1970");
Time=StructToTime(sTime);
}
Output=Time;
return(1);
}
}
El problema de Shift es que ahora no se desplaza por el número de barras sino por el número de días (me da igual si estoy en D1 o no - D1 es lo más importante). Así que creo que tengo en mi cabeza que puedo comprobar el número de díasTotal por turno (número de días de la semana) y el día actual de la semana, pero que la fórmula a utilizar - no puedo determinar.
Nota: en Unit=3 intente hacerlo (hasta ahora sin éxito)
voidOnTick()
{
MqlTick last_tick={0}; // предопределенная структура для получения текущих данных рынкаSymbolInfoTick("EURUSD",last_tick); // инструмент: указывать обязательноdouble Bid = last_tick.bid; // Текущая цена BidMqlTradeRequest request={0};
MqlTradeResult result={0};
request.action=TRADE_ACTION_DEAL;
request.magic=555;
request.symbol="EURUSD";
request.volume=1.0;
request.deviation=0;
request.type=ORDER_TYPE_BUY;
request.sl=Bid-300*_Point; // Уровень Stop Loss ордера
request.tp=Bid+1000*_Point; // Уровень Take Profit ордераOrderSend(request,result);
Comment("retcode = ",result.retcode);
}
2. Empecemos por el hecho de que su solicitud no contiene el campo obligatorio request.price (la ausencia de dicho campo sólo es aceptable para el modo de ejecución del mercado). Así que resulta que mientras request.price==0.
Вы недавно зарегистрировались и у вас возникли вопросы: Как вставить картинку в сообщение на форуме, как красиво оформить исходный код MQL5, где находятся ваши Личные сообщения? В этой статье мы подготовили для вас несколько практических советов, которые помогут быстрее освоиться на сайте MQL5.community и позволят в полной мере воспользоваться доступными функциональными возможностями.
la consulta comercial da el error 10016 ("paradas incorrectas"). ¿En qué se equivocan?
request.sl=Bid-300*_Point; // Nivel de Stop Loss de la orden
request.tp=Bid+1000*_Point; // Nivel de la orden Take Profit
En que no están normalizados. (utilice el botón SRC para insertar el código).
request.sl=NormalizeDouble(Bid-300*_Point,_Digits); // Уровень Stop Loss ордера
request.tp=NormalizeDouble(Bid+1000*_Point,_Digits); // Уровень Take Profit ордера
2. Empecemos por el hecho de que su solicitud no especifica el campo obligatorio request.price (la ausencia de dicho campo sólo se permite para el modo de ejecución del mercado). Así que resulta que mientras request.price==0.
Por ejemplo he especificado el tiempo de la vela #3. En este caso, recupero las tasas de las velas #3 y #4. Pero cómo obtener los índices de las velas #3 y #2, teniendo un tiempo de apertura de la vela #3. El número negativo no se digiere.
Tenía la idea de buscar una especie de índice, pero para hacerlo necesito copiar todos los elementos del actual, pero, caramba, si tengo M1 y una barra de 10 años, entonces el array es demasiado grande.
¿Podría explicar en qué unidades se mide el tráfico en la pestaña "Servicios" de MetaTrader 5 Strategy Tester (MetaTester 5 Agents Managers build 712)? ¿Se mide en kiloBytes|megaBytes o en kiloBytes|megaBytes?
Para iniciar sesión y usar el sitio web MQL5.com es necesario permitir el uso de Сookies.
Por favor, active este ajuste en su navegador, de lo contrario, no podrá iniciar sesión.
Ha iniciado sesión. La autenticación de dos factores se ha desactivado. Vuelva a configurarla y escanee un nuevo código QR, o continúe con la autenticación de dos factores desactivada.
Así pues, existe una función para determinar la hora de apertura de una barra (incluso si la barra está en el futuro)
El problema de Shift es que ahora no se desplaza por el número de barras sino por el número de días (me da igual si estoy en D1 o no - D1 es lo más importante). Así que creo que tengo en mi cabeza que puedo comprobar el número de díasTotal por turno (número de días de la semana) y el día actual de la semana, pero que la fórmula a utilizar - no puedo determinar.
Nota: en Unit=3 intente hacerlo (hasta ahora sin éxito)
Ayuda, por favor.
1. Inserte el código correctamente (Ctrl+Alt+M).
2. Empecemos por el hecho de que su solicitud no contiene el campo obligatorio request.price (la ausencia de dicho campo sólo es aceptable para el modo de ejecución del mercado). Así que resulta que mientras request.price==0.la consulta comercial da el error 10016 ("paradas incorrectas"). ¿En qué se equivocan?
En que no están normalizados. (utilice el botón SRC para insertar el código).
Comprobación del funcionamiento de la inserción automática de enlaces
1. Вставляйте код правильно (Ctrl+Alt+M).
1. Inserte el código correctamente (Ctrl+Alt+M).
2. Empecemos por el hecho de que su solicitud no especifica el campo obligatorio request.price (la ausencia de dicho campo sólo se permite para el modo de ejecución del mercado). Así que resulta que mientras request.price==0.Gracias. Poner el precio, ha funcionado.
Por favor, ayúdenme, no puedo entender nada.
|9|8|7|6|5|4|3|2|1|0| <-- series temporales Tasas
CopyRates(Symbol(),Period(),Time,2,Result);
Por ejemplo he especificado el tiempo de la vela #3. En este caso, recupero las tasas de las velas #3 y #4. Pero cómo obtener los índices de las velas #3 y #2, teniendo un tiempo de apertura de la vela #3. El número negativo no se digiere.
Tenía la idea de buscar una especie de índice, pero para hacerlo necesito copiar todos los elementos del actual, pero, caramba, si tengo M1 y una barra de 10 años, entonces el array es demasiado grande.
Gracias de antemano
¡Buenos días!
¿Podría explicar en qué unidades se mide el tráfico en la pestaña "Servicios" de MetaTrader 5 Strategy Tester (MetaTester 5 Agents Managers build 712)? ¿Se mide en kiloBytes|megaBytes o en kiloBytes|megaBytes?
Gracias.
Chicos, ¿podéis decirme si hay algún indicador u objeto en la base que permita mostrar los gráficos de otras monedas en el gráfico principal?
p.d. Yo escribí mi propio para mt4, pero tal vez hay uno listo aquí...
Chicos, ¿podéis decirme si hay algún indicador u objeto en la base que permita mostrar los gráficos de otras monedas en el gráfico principal?
p.d. Yo escribí mi propio para mt4, pero tal vez hay uno listo aquí...
Lo encontré, ya está escrito, z**** , no tienes que escribirlo tú. https://www.mql5.com/ru/code/1055