[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 718

 
Roger:
Leggete il file riga per riga e assegnate ogni volta dei valori alle vostre variabili. Quando il file finisce, le variabili avranno gli ultimi valori.

Come implementare questo?

Non riesco a capire cosa usare

 
zheleznii:

Come implementare questo?

Non riesco a capire cosa usare


Molto è già stato scritto e riscritto su questo, prova https://www.mql5.com/ru/forum/118349
 

Di nuovo buona notte! Ho recentemente iniziato a scrivere un EA multicurrency che apre gli ordini su una coppia di valute e apre gli ordini su un'altra.

Ho strappato il trailing stop più vicino all'EA e ho iniziato a giocarci ma non ha funzionato. Ecco il codice:

// ну так сообственно вызываю функцию - TrailingStop();
//вот что в функции
 void TrailingStop()
{ 
   if (TrailingStop<MinStop) return; 
   int ask, bid, open, stop, level; 
   for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()!=Symbol()) continue; 
      if (OrderType()==OP_BUY) 
         { 
         bid=MathRound(Bid/Point); 
         open=MathRound(OrderOpenPrice()/Point); 
         stop=MathRound(OrderStopLoss()/Point); 
         level=bid-TrailingStop; 
         if (level<open || level>bid-MinStop) continue; 
         if (stop>0 && stop>=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*Point,OrderTakeProfit(),0,White); 
         Print("трал сдвинут");
         //ShowError(); 
         } 
      if (OrderType()==OP_SELL) 
         { 
         ask=MathRound(Ask/Point); 
         open=MathRound(OrderOpenPrice()/Point); 
         stop=MathRound(OrderStopLoss()/Point); 
         level=ask+TrailingStop; 
         if (level>open || level<ask+MinStop) continue; 
         if (stop>0 && stop<=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*Point,OrderTakeProfit(),0,White); 
         //ShowError(); 
         Print("трал сдвинут");
         } 
      } 
}

Ecco quello che non riesco a capire. Dato che l'Expert Advisor è un Expert Advisor multicurrency, apre gli ordini per le valute in modo imprevedibile e a volte li apre nello stesso momento per diverse valute.

Nel codice che segue calcolo gli ordini aperti per(int i=0; i<OrdersTotal(); i++) e più avanti va la selezione dell'ordine OrderSelect ecc. Capisco che ogni ordine aperto per una certa coppia di valute richiede dati bid, ask, ecc. Ma qui voglio scoprire quali dati caricare e come selezionare un ordine per i cambiamenti. Ho solo una variante in mente, la peggiore è quella di scrivere un trailing stop per ogni valuta.

 
Infinity:

Di nuovo buona notte! Ho recentemente iniziato a scrivere un EA multicurrency che apre gli ordini su una coppia di valute e apre gli ordini su un'altra.

Ho strappato il trailing stop più vicino all'EA e ho iniziato a giocarci ma non ha funzionato. Ecco il codice:

Ecco quello che non riesco a capire. Dato che l'Expert Advisor è un Expert Advisor multicurrency, apre gli ordini per le valute in modo imprevedibile e a volte li apre nello stesso momento per diverse valute.

Nel codice che segue calcolo gli ordini aperti per(int i=0; i<OrdersTotal(); i++) e più avanti va la selezione dell'ordine OrderSelect ecc. Capisco che ogni ordine aperto per una certa coppia di valute richiede i dati bid, ask, ecc. Ma qui voglio scoprire quali dati devono essere scaricati e come selezionerò un ordine per i cambiamenti? Ho solo una variante in mente, la peggiore è quella di scrivere un trailing stop per ogni valuta.

Prova a passare un simbolo di strumento nel codice a strascico. Poi per ogni coppia si chiamerà trawl.
void TrailingStop(string sy)

if (sy == "" || sy == "0") sy = Symbol();
Bene e in base al valore sy assegnare altri valori ai dati specifici del simbolo... Lo stesso Ask con Bid, per esempio...
 

Infinity:

Non capisco bene la tecnologia, come funzionerà


 
Roger:

Molto è già stato scritto e riscritto su di esso - prova https://www.mql5.com/ru/forum/118349.

int a1;

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
FileWrite(handle,a1);

FileClose(handle);

Nel file a1=5;

Non capisco le basi.

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
qui assegniamo il valore 5 a a1

FileClose(handle);

molto necessario

 
Infinity:
Assegna valori alle variabili nel codice di trawl in base ai dati della coppia passata alla funzione. È necessario finalizzare il codice della rete a strascico... Per esempio, la variabile Bid non dovrebbe essere solo dichiarata,

ma dichiarato con un valore assegnato:

int ask = MarketInfo(sy, MODE_ASK), bid=MarketInfo(sy, MODE_BID), open, stop, level;

Di conseguenza

bid=MathRound(Bid/Point);

dovrebbe già essere scritto altrimenti, per esempio:

bid=MathRound(MarketInfo(sy, MODE_BID)/Point);

Oppure creare un'altra variabile, per esempio PriceBid e scrivere

PriceBid=MathRound(Bid/Point);

e poi usare PriceBid invece di Bid nel codice...

Guardate tutto il vostro codice e usate le variabili per un particolare simbolo dove necessario.
E questo simbolo lo passerete alla funzione trawl quando la chiamate:

 TrailingStop( EURUSD);     // Тралим ЕвроБаксы
 TrailingStop("");         // Тралим символ графика

o

TrailingStop(NULL);         // Тралим символ графика

È più chiaro?

 
artmedia70:
Assegna valori alle variabili nel codice a strascico in base ai dati della coppia passata alla funzione. È necessario finalizzare il codice della rete a strascico... Per esempio, la variabile Bid non dovrebbe essere solo dichiarata,

ma dichiarato con un valore assegnato:

Corrispondentemente

dovrebbe già essere scritto altrimenti, per esempio:

Oppure creare un'altra variabile, per esempio PriceBid e scrivere

e poi usare PriceBid invece di Bid nel codice...

Guardate tutto il vostro codice e usate il valore delle variabili per un particolare simbolo dove necessario.
E questo simbolo lo passerete alla funzione trawl quando la chiamate:

o

È più chiaro?





L'unica cosa che non capisco è quale coppia di valute mi deve essere inviata in quale momento. Non so dove ottenere l'informazione che, per esempio, 4 ordini sono aperti su tali coppie e che queste coppie mi devono essere inviate.

Non so se lo sto facendo bene o no... comunque ....

в блоке start  определяю открытые ордера и определяю по каким парам они открыты
 for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()=="EURUSD") {sy="EURUSD";MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
      if (OrderSymbol()=="GBPUSD") {sy="GBPUSD";MinStop=MarketInfo(sy,MODE_STOPLEVEL); break; }
       
      } 
  TrailingStop(sy);

а в функции делаю следующее

void TrailingStop(string sy)
{ 
   if (TrailingStop<MinStop) return; 
   int ask, bid, open, stop, level,point; 
   for (int i=0; i<OrdersTotal(); i++) 
      { 
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
      if (OrderSymbol()==sy)  
      bid=MarketInfo(sy,MODE_BID);
      ask=MarketInfo(sy,MODE_ASK);
      point=MarketInfo(sy,MODE_POINT);
      if (OrderType()==OP_BUY) 
         { 
         bid=MathRound(bid/point); 
         open=MathRound(OrderOpenPrice()/point); 
         stop=MathRound(OrderStopLoss()/point); 
         level=bid-TrailingStop; 
         if (level<open || level>bid-MinStop) continue; 
         if (stop>0 && stop>=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(),0,White); 
         Print("трал сдвинут");
         //ShowError(); 
         } 
      if (OrderType()==OP_SELL) 
         { 
         ask=MathRound(ask/point); 
         open=MathRound(OrderOpenPrice()/point); 
         stop=MathRound(OrderStopLoss()/point); 
         level=ask+TrailingStop; 
         if (level>open || level<ask+MinStop) continue; 
         if (stop>0 && stop<=level) continue; 
         OrderModify(OrderTicket(),OrderOpenPrice(),level*point,OrderTakeProfit(),0,White); 
         //ShowError(); 
         Print("трал сдвинут");
         } 
      } 
}

Ma per qualche motivo ho ottenuto un errore EURUSD: zero divide - questo errore probabilmente significa da qualche parte nella variabile 0, probabilmente durante un'operazione di tipo split. Sto cercando di implementarlo correttamente?

 
zheleznii:

int a1;

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
FileWrite(handle,a1);

FileClose(handle);
Nel file a1=5;

Incomprensione nelle basi. Si prega di spiegare - completando la proposta

int handle=FileOpen("a1.csv",FILE_READ|FILE_WRITE,';');
qui assegniamo il valore 5 a a1

FileClose(handle);

Ne ho davvero bisogno.

Quindi, nell'ordine.

Se sono necessari solo gli ultimi dati, perché salvare quelli precedenti? ("prima della scrittura" si verifica con la combinazione dei modi FILE_READ|FILE_WRITE).
Perciò è più logico usare FILE_CSV|FILE_WRITE mode, dove i record precedenti vengono cancellati prima di scrivere nuovi dati.

Cominciamo a scrivere 4 variabili nel file.

//+------------------------------------------------------------------+
int start(){
   int handle;
   int a1 = 3;
   double punkt = 0.4;
   double nn = 1128;
   double mm = 1000;

   handle=FileOpen("a1.csv",FILE_CSV|FILE_WRITE,';');
   FileWrite(handle,a1,punkt,nn,mm);
   FileClose(handle);           
}
//+------------------------------------------------------------------+

La cosa principale è ricordare l'ordine in cui sono scritte le variabili, perché questo è l'ordine in cui le leggeremo.

Cominciamo a leggere i dati nelle variabili dal file.

//+------------------------------------------------------------------+
int start(){
   int handle;
   int a;
   double p;
   double n;
   double m;   
   handle=FileOpen("a1.csv",FILE_CSV|FILE_READ, ';');         
   
   a = FileReadNumber(handle);    //считываем первую цифру, соответствующую переменной a1 и далее по порядку...
   p = FileReadNumber(handle);    //punkt
   n = FileReadNumber(handle);    //nn
   m = FileReadNumber(handle);    //mm
   
   FileClose(handle);           
}
//+------------------------------------------------------------------+

Usando la funzione FileReadNumber(), leggiamo il numero dopo il numero nell'ordine in cui sono stati scritti.
Questo è tutto quello che c'è da fare, niente di complicato :)

 
Infinity:


L'unica cosa che non capisco è quale coppia di valute mi deve essere inviata in quale momento. Dove ottengo l'informazione che, per esempio, 4 ordini sono aperti su tali coppie e che queste coppie mi devono essere inviate?

Non so se lo sto facendo bene o no ... comunque ....

Ma ho ottenuto EURUSD: zero divide error. Apparentemente, questo errore dice che ho 0 in una variabile da qualche parte, probabilmente, è un'operazione di divisione. Sto cercando di implementarlo correttamente?

Fate il proofreading dopo ogni operazione di assegnazione di variabile, o prima di ogni operazione di divisione, per vedere dove ottenete uno zero, e poi cominciate da lì.