EA non apre una nuova posizione su un altro simbolo

 

Ciao a tutti, sono nuovo nella programmazione mql5 e sto cercando di creare il mio EA, ma ho un problema. Questo EA quando si ha la condizione di aprire una nuova posizione, non funziona se esiste un'altra posizione su un simbolo diverso. Non so se si tratta di un problema di logica o di codice. Grazie per l'aiuto.

Traduzione automatica applicata dal moderatore
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.02"

#include <Trade/Trade.mqh>
#include <Trade/PositionInfo.mqh>
//------------------------------
//-------GLOBAL VARIABLES-------
//------------------------------
input int MaPeriod = 50;        //MA1 Period
input int Ma2Period = 100;      //MA2 Period
input double Inplot = 0.01;     //Lot
int Ma;
int Ma2;
double MaValue[];
double MaValue2[];
MqlTick LastTick;
MqlDateTime time;
CTrade trade;
CPositionInfo info;
string endtime = "20:00";
long Inpmagic = 3434;
input int timestart = 8;      //Time start
input int timeend = 20;       //Time end
string simbolo;  


int OnInit(){

   Ma = iMA(_Symbol,PERIOD_CURRENT,MaPeriod,0,MODE_SMA,PRICE_CLOSE);
   Ma2 = iMA(_Symbol,PERIOD_CURRENT,Ma2Period,0,MODE_SMA,PRICE_CLOSE);
   
   ArraySetAsSeries(MaValue,true);
   ArraySetAsSeries(MaValue2,true);

   trade.SetExpertMagicNumber(Inpmagic);
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){
 
   datetime OpenTime  = 0;
   datetime OpenTimeSell = 0;
   double lot = Inplot;
      
   if(lot < MinVolume){
      lot = MinVolume;
   }
   
   if(lot > MaxVolume){
      lot = MaxVolume;
   }
      
   CopyBuffer(Ma,0,1,10,MaValue);
   CopyBuffer(Ma2,0,1,10,MaValue2);

   TimeCurrent(time);
   SymbolInfoTick(_Symbol,LastTick);
   
   if(time.hour > timestart && time.hour < timeend && OpenTime != iTime(_Symbol,PERIOD_CURRENT,0) && CountOpenPositions()==0 
   && OpenSymbols() != _Symbol){
   
   OpenTime = iTime(_Symbol,PERIOD_CURRENT,0);
      
   if(MaValue [1]  < MaValue [2]  && 
      MaValue2[1]  < MaValue2[2]){
      
      trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,LastTick.bid,0,0,"SELL_MA_EA");
      
   }

   if(MaValue [1]  > MaValue [2] && 
      MaValue2[1]  > MaValue2[2]){
      
      trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lot,LastTick.ask,0,0,"BUY_MA_EA");
    }
 }
 if(time.day_of_week == 5 && time.hour > timeend){
   ClosePositionBuy();
   ClosePositionSell();
 }
}
//+------------------------------------------------------------------+
bool ClosePositionBuy(){
   int total = PositionsTotal();
   for(int i = total-1; i>=0; i--){
      if(total != PositionsTotal()){total = PositionsTotal(); i = total; continue;}
      ulong ticket = PositionGetTicket(i); // select position
      if(ticket <= 0){Print("Failed to get position ticket"); return false;} 
      if(!PositionSelectByTicket(ticket)){Print("Failed to select position by ticket"); return false;}
      long type;
      if(PositionGetInteger(POSITION_TYPE,type)==POSITION_TYPE_BUY){
      long magicnumber ;
      if(!PositionGetInteger(POSITION_MAGIC,magicnumber)){Print("Failde to select position magicnumber");}
      if(magicnumber == Inpmagic){
         trade.PositionClose(ticket);
         if(trade.ResultRetcode() != TRADE_RETCODE_DONE){
            Print("Failed to close position. Result : " + (string)trade.ResultRetcode() + " : " + trade.ResultRetcodeDescription());
            return false;
         }
      }
   } 
}     
    return true;
} 

bool ClosePositionSell(){
   int total = PositionsTotal();
   for(int i = total-1; i>=0; i--){
      if(total != PositionsTotal()){total = PositionsTotal(); i = total; continue;}
      ulong ticket = PositionGetTicket(i); // select position
      if(ticket <= 0){Print("Failed to get position ticket"); return false;} 
      if(!PositionSelectByTicket(ticket)){Print("Failed to select position by ticket"); return false;}
      long type;
      if(PositionGetInteger(POSITION_TYPE,type)==POSITION_TYPE_SELL){
      long magicnumber ;
      if(!PositionGetInteger(POSITION_MAGIC,magicnumber)){Print("Failde to select position magicnumber");}
      if(magicnumber == Inpmagic){
         trade.PositionClose(ticket);
         if(trade.ResultRetcode() != TRADE_RETCODE_DONE){
            Print("Failed to close position. Result : " + (string)trade.ResultRetcode() + " : " + trade.ResultRetcodeDescription());
            return false;
         }
      }
   } 
}     
    return true;
}

int CountOpenPositions(){
int cnt = 0;
int total = PositionsTotal();
   for(int i = total-1; i >= 0; i--){
      ulong ticket = PositionGetTicket(i);
      string pair  = PositionGetSymbol(i); 
      if(ticket <= 0 ){Print("Failed to get posiyion ticket"); return -1;}
      if(!PositionSelectByTicket(ticket)){Print("Failed to select position by ticket"); return -1;}
      string Pair;
      if(!PositionGetString(POSITION_SYMBOL,Pair)){Print("Failed to get position magicnumber"); return -1;}
      ulong magicnumber;
      if(!PositionGetInteger(POSITION_MAGIC,magicnumber)){Print("Failed to get position magicnumber"); return -1;}
      if(Pair == pair && Inpmagic == magicnumber){cnt++;}
   }   
   return cnt;
}

string OpenSymbols(){
string smbl = 0;
int total = PositionsTotal();
   for(int i = total-1; i >= 0; i--){
      string pair  = PositionGetSymbol(i); 
      string Pair;
      if(!PositionGetString(POSITION_SYMBOL,Pair)){Print("Failed to get position magicnumber"); return -1;}
      if(Pair == pair){return smbl;}
   }   
   return -1;
}
Scopri le nuove opportunità di MetaTrader 5 con la community e i servizi MQL5
Scopri le nuove opportunità di MetaTrader 5 con la community e i servizi MQL5
  • 2023.10.05
  • www.mql5.com
MQL5: il linguaggio delle strategie di trading integrato nella piattaforma di trading MetaTrader 5 permette di creare i propri robot di trading, indicatori tecnici, script e librerie di funzioni
 
Gabriele Zuccala:

Hi every one, I'm new in mql5 programming and I'm trying to create my EA, but I've a problem. This EA when have the condition to open a new position, it doesn't work if exist another position on a different symbol. I don't now if it's a logic or code problem. Thank you for your help.


Intanto questo è un forum in italiano perciò scrivi in italiano, valuta poi sempre la sezione più indicata di dove postare in base all'argomento. Per quello che riguarda il tuo quesito, nella funzione CountOpenPosition() prendi due volte il nome del simbolo della posizione aumentando cnt e ritornando un valore diverso da 0. Dovresti rivedere un po tutta la funzione ci sono dei passaggi inutili, già chiamando la funzione:
PositionGetSymbol(i);
selezioni la posizione per poterci lavorare.