Nikolay Gaylis: Por favor, indique cómo seleccionar un símbolo en el probador para probar en
No se puede. Sólo se puede seleccionar manualmente en los ajustes.
En el probador, por supuesto, puede solicitar datos sobre otros símbolos, pero para ello tendrá que esforzarse bastante para garantizar la sincronización de los datos (el propio probador no lo hará por usted, porque por defecto trabaja con un solo símbolo). El comercio en el símbolo, diferente de la seleccionada, en general, no puede.
P. S. Todo esto es para MT4. En MT5 la situación es diferente.
El EA funciona conOnTimer()EventSetTimer(1).Me faltan muchos ticks. El eventoOnTick() no es adecuado para mí, porque analizo varios pares de divisas a la vez ... Incluso Sleep(200) en el bucle cargará el sistema... ¿Qué hacer?
Nikolay Gaylis: El Asesor Experto funciona enOnTimer() EventSetTimer(1). Me pierdo muchos ticks. El eventoOnTick() no me sirve porque analizo varios pares de divisas a la vez... Incluso Sleep(200) en el bucle cargará el sistema... ¿Qué hacer?
También existe EventSetMillisecondTimer() - puede reducir la periodicidad de la ejecución de OnTimer().
El mensaje "Array out of range" aparece en el lugar resaltado durante la prueba. No indica un error durante la compilación. ¿Cuál es la esencia del error y cómo podemos solucionarlo?
double TD_Close=Cierre[1];
for (int i=2; i<=Period_bars; i++)
{
if (ABS_High<High[i]) ABS_High=High[i];
}
if (TD_Close>ABS_High)
{
if(OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0);
El mensaje "Array out of range" aparece en el espacio asignado durante la prueba. No indica un error durante la compilación. ¿Cuál es la esencia del error y cómo podemos solucionarlo?
double TD_Close=Cierre[1];
for (int i=2; i<=Period_bars; i++)
{
if (ABS_High<High[i]) ABS_High=High[i];
}
if (TD_Close>ABS_High)
{
if (OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0);
Hola amigos, ayúdenme a resolver el siguiente problema: Estoy tratando de escribir un simple Asesor Experto y me he encontrado con lo siguiente: si el SL se establece en un valor diferente de 0, entonces las operaciones no se abren en absoluto, así como las funciones TP, TStop y TrailingStep no funcionan en absoluto.
¿Qué debo arreglar en el código?
//+------------------------------------------------------------------+//| MA.mq4 |//| Sergey |//| http://www.mql4.com |//+------------------------------------------------------------------+#property copyright"Sergey Karev"#property link"http://www.mql4.com"#property description"Moving Average sample expert advisor"//#property strict#define MAGICMA 23101987//--- Inputsinputdouble Lots = 0.01; // Объем лотаinputint SL = 0; // Stop Lossinputint TP = 0; // Take profitinputint TStop = 0; // Пунктыinputint TrailingStep = 0; // Шаг TS в пунктахinputint MA_per1 = 5; // MA быстраяinputint MA_per2 = 55; // MA медленнаяinputint Timeframe = 60; // Таймфрейм inputdouble MaximumRisk = 0.02;
inputdouble DecreaseFactor = 3;
inputint MovingShift = 0; // Cдвиг среднейinputint Shift = 0; // Сдвиг баровinputint Magic_number = 1987; // Если Magic = 0, то работает + ручные ордерыbool TSProfitOnly = true;
int NumberOfTry = 5;
bool UseSound = True;
string NameFileSound = "expert.wav";
//+------------------------------------------------------------------+//| Calculate open positions |//+------------------------------------------------------------------+int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//---for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//--- return orders volumeif(buys>0) return(buys);
elsereturn(-sells);
}
//+------------------------------------------------------------------+//| Calculate optimal lot size |//+------------------------------------------------------------------+double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders totalint losses=0; // number of losses orders without a break//--- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//--- calcuulate number of losses orders without a breakif(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//---if(OrderProfit()>0) break;
if(OrderProfit()<0) losses++;
}
if(losses>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//--- return lot sizeif(lot<0.1) lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+//| Check for open order conditions |//+------------------------------------------------------------------+void CheckForOpen()
{
double ma1;
double ma2;
int res;
//+------------------------------------------------------------------+//| Приводим SL и TP к единым целым |//+------------------------------------------------------------------+ double sl=0, tp=0;
sl=NormalizeDouble(SL*Point(),_Digits);
tp=NormalizeDouble(TP*Point(),_Digits);
//--- go trading only for first tiks of new barif(Volume[0]>1) return;
//--- get Moving Average
ma1=iMA(NULL, Timeframe, MA_per1, MovingShift, MODE_SMMA, PRICE_CLOSE,Shift);
ma2=iMA(NULL, Timeframe, MA_per2, MovingShift, MODE_SMMA, PRICE_CLOSE,Shift);
// имя символа, таймфрейм, период, сдвиг средней, метод усреднения, тип цены, сдвиг//--- sell conditionsif(ma1 < ma2) //[1] - номер свечи
{
res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,sl,tp,"",MAGICMA,0,Red);
return;
}
//--- buy conditionsif(ma1 > ma2)
{
res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,sl,tp,"",MAGICMA,0,Blue);
return;
}
//---
}
//+------------------------------------------------------------------+//| Check for close order conditions |//+------------------------------------------------------------------+void CheckForClose()
{
double ma1;
double ma2;
//--- go trading only for first tiks of new barif(Volume[0]>1) return;
//--- get Moving Average
ma1=iMA(NULL,Timeframe,MA_per1,MovingShift,MODE_SMMA,PRICE_CLOSE,Shift);
ma2=iMA(NULL,Timeframe,MA_per2,MovingShift,MODE_SMMA,PRICE_CLOSE,Shift);
//---for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//--- check order type if(OrderType()==OP_BUY)
{
if(ma1 < ma2)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
Print("OrderClose error ",GetLastError());
}
break;
}
if(OrderType()==OP_SELL)
{
if(ma1 > ma2)
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
Print("OrderClose error ",GetLastError());
}
break;
}
}
//---
}
//+------------------------------------------------------------------+//| OnTick function |//+------------------------------------------------------------------+voidOnTick()
{
//--- check for history and tradingif(Bars<100 || IsTradeAllowed()==false)
return;
//--- calculate open orders by current symbolif(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//+------------------------------------------------------------------+//| Trailing Stop / Step |//+------------------------------------------------------------------+double tr=0, ts=0, op=0, sl=0,
ask=NormalizeDouble(Ask,_Digits),
bid=NormalizeDouble(Bid,_Digits);
tr=NormalizeDouble(TStop*Point(),_Digits);
ts=NormalizeDouble(TrailingStep*Point(),_Digits); // Приводим к единым величинам (включая центовые счета)double ma2 = iMA(NULL,Timeframe,MA_per2,MovingShift,MODE_SMMA,PRICE_CLOSE,Shift);
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()==Symbol())
{
if(OrderMagicNumber()==Magic_number) // Если Magic = 0, то работает + ручные ордеры
{
op=NormalizeDouble(OrderOpenPrice(),_Digits);
sl=NormalizeDouble(OrderStopLoss(),_Digits);
if(OrderType()==OP_BUY)
{
if((bid-op)>tr)
if((bid-sl)>tr)
if((bid-tr)>ma2)
if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(ma2,_Digits),OrderTakeProfit(),0, clrGreen)==false)
Print("Error BUY OrderModify");
}
if(OrderType()==OP_SELL)
{
if((op-ask)>tr)
if((sl-ask)>tr || sl==0)
if((ask+tr)<ma2)
if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(ma2,_Digits),OrderTakeProfit(),0, clrGreen)==false)
Print("Error SELL OrderModify");
}
}
}
}
}
}
//+----------------------------------------------------------------------+
Hola amigos, ayúdenme a resolver el siguiente problema: estoy tratando de escribir un simple Asesor Experto y me encontré con lo siguiente: si el SL se establece en un valor diferente de 0, entonces las operaciones no se abren en absoluto, así como el TP, TStop y TrailingStep no funcionan en absoluto.
Por favor, indique cómo seleccionar un símbolo en el probador para probar en
No se puede. Sólo se puede seleccionar manualmente en los ajustes.
En el probador, por supuesto, puede solicitar datos sobre otros símbolos, pero para ello tendrá que esforzarse bastante para garantizar la sincronización de los datos (el propio probador no lo hará por usted, porque por defecto trabaja con un solo símbolo). El comercio en el símbolo, diferente de la seleccionada, en general, no puede.
P. S. Todo esto es para MT4. En MT5 la situación es diferente.
¡NO SE PERMITE LA DESCOMPILACIÓN!
El Asesor Experto funciona enOnTimer() EventSetTimer(1). Me pierdo muchos ticks. El eventoOnTick() no me sirve porque analizo varios pares de divisas a la vez... Incluso Sleep(200) en el bucle cargará el sistema... ¿Qué hacer?
También existe EventSetMillisecondTimer() - puede reducir la periodicidad de la ejecución de OnTimer().
También existe EventSetMillisecondTimer() - así puedes reducir la periodicidad de OnTimer().
Gracias, lo probaré...
Buenas tardes.
El mensaje "Array out of range" aparece en el lugar resaltado durante la prueba. No indica un error durante la compilación. ¿Cuál es la esencia del error y cómo podemos solucionarlo?
double TD_Close=Cierre[1];
for (int i=2; i<=Period_bars; i++)
{
if (ABS_High<High[i]) ABS_High=High[i];
}
if (TD_Close>ABS_High)
{
if(OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0);
else nuevaVela = Tiempo[0];
}
Buenas tardes.
El mensaje "Array out of range" aparece en el espacio asignado durante la prueba. No indica un error durante la compilación. ¿Cuál es la esencia del error y cómo podemos solucionarlo?
double TD_Close=Cierre[1];
for (int i=2; i<=Period_bars; i++)
{
if (ABS_High<High[i]) ABS_High=High[i];
}
if (TD_Close>ABS_High)
{
if (OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0);
else nuevaVela = Tiempo[0];
}
Period_bars debe ser <= Bars - 1
Hola amigos, ayúdenme a resolver el siguiente problema: Estoy tratando de escribir un simple Asesor Experto y me he encontrado con lo siguiente: si el SL se establece en un valor diferente de 0, entonces las operaciones no se abren en absoluto, así como las funciones TP, TStop y TrailingStep no funcionan en absoluto.
¿Qué debo arreglar en el código?
Hola amigos, ayúdenme a resolver el siguiente problema: estoy tratando de escribir un simple Asesor Experto y me encontré con lo siguiente: si el SL se establece en un valor diferente de 0, entonces las operaciones no se abren en absoluto, así como el TP, TStop y TrailingStep no funcionan en absoluto.
¿Qué debo arreglar en el código?