Nikolay Gaylis: Veuillez indiquer comment sélectionner un symbole dans le testeur pour le tester en
Tu ne peux pas. Uniquement sélection manuelle dans les paramètres.
Dans le testeur, vous pouvez bien sûr demander des données sur d'autres symboles, mais pour cela vous devrez travailler assez dur pour assurer la synchronisation des données (le testeur lui-même ne le fera pas pour vous, car par défaut il travaille avec un seul symbole). Commerce sur le symbole, différent de celui sélectionné, en général, ne peut pas.
P. S. Tout ceci est pour MT4. Dans MT5, la situation est différente.
EA fonctionne avecOnTimer()EventSetTimer(1).je manque beaucoup de ticks. L'événementOnTick() ne me convient pas, car j'analyse plusieurs paires de devises à la fois ... Même Sleep(200) dans la boucle chargera le système... Que faire ?
Nikolay Gaylis: Le conseiller expert fonctionne avecOnTimer() EventSetTimer(1), mais il me manque beaucoup de ticks. L'événementOnTick() ne me convient pas car j'analyse plusieurs paires de devises à la fois ... Même Sleep(200) dans la boucle chargera le système... Que faire ?
Il existe également EventSetMillisecondTimer() - il peut réduire la périodicité de l'exécution de OnTimer().
Le message "Array out of range" apparaît dans l'espace alloué pendant le test. Il n'indique pas une erreur lors de la compilation. Quelle est l'essence de l'erreur et comment pouvons-nous la corriger ?
Le message "Array out of range" apparaît à l'endroit mis en évidence pendant le test. Il n'indique pas une erreur lors de la compilation. Quelle est l'essence de l'erreur et comment pouvons-nous la corriger ?
double TD_Close=Close[1] ;
for (int i=2 ; i<=Period_bars ; i++)
{
si (ABS_High<High[i]) ABS_High=High[i] ;
}
si (TD_Close>ABS_High)
{
si (OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0) ;
Bonjour, mes amis, aidez-moi à résoudre le problème suivant : J'essaie d'écrire un simple Expert Advisor et j'ai rencontré le problème suivant : si le SL est défini à une valeur différente de 0, alors les trades ne sont pas ouverts du tout, ainsi que les fonctions TP, TStop et TrailingStep ne fonctionnent pas du tout.
Que dois-je corriger dans le code ?
//+------------------------------------------------------------------+//| 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");
}
}
}
}
}
}
//+----------------------------------------------------------------------+
Bonjour, mes amis, aidez-moi à résoudre le problème suivant : J'essaie d'écrire un simple Expert Advisor et j'ai rencontré le problème suivant : si le SL est défini à une valeur différente de 0, alors les trades ne sont pas ouverts du tout, ainsi que les fonctions TP, TStop et TrailingStep ne fonctionnent pas du tout.
Que dois-je corriger dans le code ?
Utilisez-vous un débogueur pour rechercher les erreurs ?
Veuillez indiquer comment sélectionner un symbole dans le testeur pour le tester en
Tu ne peux pas. Uniquement sélection manuelle dans les paramètres.
Dans le testeur, vous pouvez bien sûr demander des données sur d'autres symboles, mais pour cela vous devrez travailler assez dur pour assurer la synchronisation des données (le testeur lui-même ne le fera pas pour vous, car par défaut il travaille avec un seul symbole). Commerce sur le symbole, différent de celui sélectionné, en général, ne peut pas.
P. S. Tout ceci est pour MT4. Dans MT5, la situation est différente.
PAS DE DÉCOMPILATION AUTORISÉE !
Le conseiller expert fonctionne avecOnTimer() EventSetTimer(1), mais il me manque beaucoup de ticks. L'événementOnTick() ne me convient pas car j'analyse plusieurs paires de devises à la fois ... Même Sleep(200) dans la boucle chargera le système... Que faire ?
Il existe également EventSetMillisecondTimer() - il peut réduire la périodicité de l'exécution de OnTimer().
Il existe également EventSetMillisecondTimer() - ce qui vous permet de réduire la périodicité de OnTimer().
Merci, je vais essayer...
Bon après-midi.
Le message "Array out of range" apparaît dans l'espace alloué pendant le test. Il n'indique pas une erreur lors de la compilation. Quelle est l'essence de l'erreur et comment pouvons-nous la corriger ?
double TD_Close=Close[1] ;
for (int i=2 ; i<=Period_bars ; i++)
{
si (ABS_High<High[i]) ABS_High=High[i] ;
}
si (TD_Close>ABS_High)
{
si(OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0) ;
else newCandle = Time[0] ;
}
Bon après-midi.
Le message "Array out of range" apparaît à l'endroit mis en évidence pendant le test. Il n'indique pas une erreur lors de la compilation. Quelle est l'essence de l'erreur et comment pouvons-nous la corriger ?
double TD_Close=Close[1] ;
for (int i=2 ; i<=Period_bars ; i++)
{
si (ABS_High<High[i]) ABS_High=High[i] ;
}
si (TD_Close>ABS_High)
{
si (OrdersTotal () <= 1 && newCandle != Time[0]) int tiket=OrderSend(Symbol(),OP_BUY,volume,Ask,3,sl,tp,",magic,0) ;
else newCandle = Time[0] ;
}
Period_bars doit être <= Bars - 1
Bonjour, mes amis, aidez-moi à résoudre le problème suivant : J'essaie d'écrire un simple Expert Advisor et j'ai rencontré le problème suivant : si le SL est défini à une valeur différente de 0, alors les trades ne sont pas ouverts du tout, ainsi que les fonctions TP, TStop et TrailingStep ne fonctionnent pas du tout.
Que dois-je corriger dans le code ?
Bonjour, mes amis, aidez-moi à résoudre le problème suivant : J'essaie d'écrire un simple Expert Advisor et j'ai rencontré le problème suivant : si le SL est défini à une valeur différente de 0, alors les trades ne sont pas ouverts du tout, ainsi que les fonctions TP, TStop et TrailingStep ne fonctionnent pas du tout.
Que dois-je corriger dans le code ?