Nikolay Gaylis: Wie wählt man ein Symbol im Tester für die Prüfung in
Das können Sie nicht. Nur manuell in den Einstellungen auswählen.
Im Tester können Sie natürlich Daten zu anderen Symbolen abfragen, aber dafür müssen Sie hart genug arbeiten, um die Synchronisierung der Daten zu gewährleisten (der Tester selbst wird dies nicht für Sie tun, da er standardmäßig mit einem Symbol arbeitet). Handel auf das Symbol, anders als die ausgewählten, in der Regel nicht.
P. S. All dies gilt für MT4. Bei MT5 ist die Situation anders.
EA arbeitet mitOnTimer()EventSetTimer(1). ich vermisse viele Ticks. Das EreignisOnTick() ist für mich nicht geeignet, da ich mehrere Währungspaare auf einmal analysiere ... Selbst Sleep(200) in der Schleife lädt das System... Was ist zu tun?
Nikolay Gaylis: Der Expert Advisor arbeitet mitOnTimer() EventSetTimer(1). Ich verpasse viele Ticks. DasOnTick()-Ereignis passt mir nicht, weil ich mehrere Währungspaare auf einmal analysiere ... Selbst Sleep(200) in der Schleife lädt das System... Was ist zu tun?
Es gibt auch EventSetMillisecondTimer() - es kann die Periodizität der Ausführung von OnTimer() reduzieren.
Die Meldung "Array out of range" erscheint während des Tests an der markierten Stelle. Er zeigt keinen Fehler bei der Kompilierung an. Was ist die Ursache des Fehlers und wie können wir ihn beheben?
double TD_Close=Close[1];
for (int i=2; i<=Period_bars; i++)
{
if (ABS_High<High[i]) ABS_High=High[i];
}
wenn (TD_Close>ABS_High)
{
if(OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0);
Die Meldung "Array out of range" erscheint während des Tests an der markierten Stelle. Er zeigt keinen Fehler bei der Kompilierung an. Was ist die Ursache des Fehlers und wie können wir ihn beheben?
double TD_Close=Close[1];
for (int i=2; i<=Period_bars; i++)
{
if (ABS_High<High[i]) ABS_High=High[i];
}
wenn (TD_Close>ABS_High)
{
if (OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0);
Hallo, Freunde, helfen Sie mir, das folgende Problem zu lösen: Ich versuche, einen einfachen Expert Advisor zu schreiben, und bin auf folgendes Problem gestoßen: Wenn der SL auf einen Wert ungleich 0 gesetzt wird, werden die Geschäfte überhaupt nicht geöffnet, und die Funktionen TP, TStop und TrailingStep funktionieren überhaupt nicht.
Was sollte ich im Code ändern?
//+------------------------------------------------------------------+//| 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");
}
}
}
}
}
}
//+----------------------------------------------------------------------+
Hallo, Freunde, helfen Sie mir, das folgende Problem zu lösen: Ich versuche, einen einfachen Expert Advisor zu schreiben und wurde mit dem folgenden Problem konfrontiert: Wenn der SL auf einen Wert ungleich 0 gesetzt wird, werden die Trades überhaupt nicht geöffnet, und auch TP, TStop und TrailingStep funktionieren nicht.
Was sollte ich im Code ändern?
Verwenden Sie einen Debugger, um nach Fehlern zu suchen?
Wie wählt man ein Symbol im Tester für die Prüfung in
Das können Sie nicht. Nur manuell in den Einstellungen auswählen.
Im Tester können Sie natürlich Daten zu anderen Symbolen abfragen, aber dafür müssen Sie hart genug arbeiten, um die Synchronisierung der Daten zu gewährleisten (der Tester selbst wird dies nicht für Sie tun, da er standardmäßig mit einem Symbol arbeitet). Handel auf das Symbol, anders als die ausgewählten, in der Regel nicht.
P. S. All dies gilt für MT4. Bei MT5 ist die Situation anders.
KEINE DEKOMPILIERUNG ERLAUBT!
Der Expert Advisor arbeitet mitOnTimer() EventSetTimer(1). Ich verpasse viele Ticks. DasOnTick()-Ereignis passt mir nicht, weil ich mehrere Währungspaare auf einmal analysiere ... Selbst Sleep(200) in der Schleife lädt das System... Was ist zu tun?
Es gibt auch EventSetMillisecondTimer() - es kann die Periodizität der Ausführung von OnTimer() reduzieren.
Es gibt auch EventSetMillisecondTimer() - so können Sie die Periodizität von OnTimer() reduzieren.
Danke, ich werde es ausprobieren...
Guten Tag.
Die Meldung "Array out of range" erscheint während des Tests an der markierten Stelle. Er zeigt keinen Fehler bei der Kompilierung an. Was ist die Ursache des Fehlers und wie können wir ihn beheben?
double TD_Close=Close[1];
for (int i=2; i<=Period_bars; i++)
{
if (ABS_High<High[i]) ABS_High=High[i];
}
wenn (TD_Close>ABS_High)
{
if(OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0);
else newCandle = Time[0];
}
Guten Tag.
Die Meldung "Array out of range" erscheint während des Tests an der markierten Stelle. Er zeigt keinen Fehler bei der Kompilierung an. Was ist die Ursache des Fehlers und wie können wir ihn beheben?
double TD_Close=Close[1];
for (int i=2; i<=Period_bars; i++)
{
if (ABS_High<High[i]) ABS_High=High[i];
}
wenn (TD_Close>ABS_High)
{
if (OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0);
else newCandle = Time[0];
}
Zeitraum_Balken sollte <= Balken - 1 sein
Hallo, Freunde, helfen Sie mir, das folgende Problem zu lösen: Ich versuche, einen einfachen Expert Advisor zu schreiben, und bin auf folgendes Problem gestoßen: Wenn der SL auf einen Wert ungleich 0 gesetzt wird, werden die Geschäfte überhaupt nicht geöffnet, und die Funktionen TP, TStop und TrailingStep funktionieren überhaupt nicht.
Was sollte ich im Code ändern?
Hallo, Freunde, helfen Sie mir, das folgende Problem zu lösen: Ich versuche, einen einfachen Expert Advisor zu schreiben und wurde mit dem folgenden Problem konfrontiert: Wenn der SL auf einen Wert ungleich 0 gesetzt wird, werden die Trades überhaupt nicht geöffnet, und auch TP, TStop und TrailingStep funktionieren nicht.
Was sollte ich im Code ändern?