Questions des débutants MQL4 MT4 MetaTrader 4 - page 129

 
Pouvez-vous me dire comment sélectionner le symbole à tester dans le testeur ?
int OnInit(){return(INIT_SUCCEEDED);}
 
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 ?
 

PAS DE DÉCOMPILATION AUTORISÉE !

 
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().

 
Vladislav Boyko:

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] ;

}

 
Andrey.Sabitov:

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 ?

//+------------------------------------------------------------------+
//|                                                           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
//--- Inputs
input double Lots              = 0.01; // Объем лота
input int    SL                = 0;    // Stop Loss
input int    TP                = 0;    // Take profit
input int    TStop             = 0;    // Пункты
input int    TrailingStep      = 0;    // Шаг TS в пунктах
input int    MA_per1           = 5;    // MA быстрая
input int    MA_per2           = 55;   // MA медленная
input int    Timeframe         = 60;   // Таймфрейм 
input double MaximumRisk       = 0.02;
input double DecreaseFactor    = 3;
input int    MovingShift       = 0;    // Cдвиг средней
input int    Shift             = 0;    // Сдвиг баров
input int    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 volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    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 break
   if(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 size
   if(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 bar
   if(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 conditions
   if(ma1 < ma2) //[1] - номер свечи
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,sl,tp,"",MAGICMA,0,Red);
      return;
     }
//--- buy conditions
   if(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 bar
   if(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                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol
   if(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");                  
               }
            }
         }
      }
   }
  }
//+----------------------------------------------------------------------+

MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader
MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader
  • www.mql4.com
MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader
 
Sergey_M_K:

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 ?
Raison: