[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 220

 
paladin80:
Nella mia esperienza, il modo più efficace per trovare gli errori è quello di visualizzare un messaggio nei commenti con il numero di errore seguito da un'esecuzione visiva dell'EA. All'inizio ci vuole molto tempo, ma poi si impara rapidamente a farlo senza errori. Potete anche escludere parti di codice con /* ... */ è possibile determinare come cambia il comportamento dell'EA.
Io faccio lo stesso))
 
alsu:
Hai capito bene. Inoltre, quando prendiamo un valore dalla scatola, questo è di tipo double, ma se viene dato il comando di scrivere il risultato in una variabile di tipo int, il compilatore farà automaticamente tutti i passi necessari per mettere il valore in una nuova scatola.


Per essere finalmente sicuro di aver capito bene, controlla i miei pensieri sul tuo ultimo paragrafo... Perciò, facciamo in modo che l'esperto di cui sopra sia presente:

//--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int    Experts;                                 // Колич. экспертов
double Depo=10000.0,                            // Заданный депозит
       Persent=30,                              // Заданный процент     
       Money;                                   // Искомые средства
string Quantity="GV_Quantity";                  // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                      // Спец. функция init
  {
   Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.
   Experts=Experts+1;                           // Колич. экспертов
   GlobalVariableSet(Quantity, Experts);        // Новое значение
   Money=Depo*Persent/100/Experts;              // Средства для эксп.
   Alert("Для эксперта в окне ", Symbol()," выделено ",Money);
   return;                                      // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.
   if (Experts!=New_Experts)                    // Если изменилось
     {
      Experts=New_Experts;                      // Теперь текущ. такое
      Money=Depo*Persent/100/Experts;           // Новое знач. средств 
      Alert("Новое значение для эксперта ",Symbol(),": ",Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                    // Спец. ф-ия deinit
  {
   if (Experts ==1)                             // Если эксперт один..
      GlobalVariableDel(Quantity);              //..удаляем GV-перемен
   else                                         // А иначе..
      GlobalVariableSet(Quantity, Experts-1);   //..уменьшаем на 1
   Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке
   return;                                      // Выход из deinit()
  }
//--------------------------------------------------------------------

Poi nella stringa:

Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.

Mettiamo una variabile di tipo intero Experts nella casella "GV-variable" per la memorizzazione (convertendola al tipo double). Allora se (ipotesi ipotetica) ci fosse una stringa nell'Expert Advisor

int New_Experts=Experts;

vorrebbe dire che c'è un comando per scrivere il risultato in una variabile di tipo int. In questo caso il compilatore:

* prenderebbe il valore della variabile di tipo double fuori dalla scatola,

* apportare le modifiche necessarie al valore della variabile Experts,

* assegnare questo valore alla variabile New_Experts e...

* mettere il valore della variabile New_Experts in una casella "int".

Quindi il tipo di variabile non è altro che un wrapper/pacchetto esterno di qualche valore? e quindi le variabili GV non possono essere di tipo stringa, poiché il downgrade è permesso solo per i valori numerici, e le stringhe non vengono convertite in numeri.

Giusto?

Grazie in anticipo per la vostra risposta.

 
Stells:
cosa non così per (f=1;f<Bars;f++)
{
Price1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT)
Prezzo2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT);
Spread = Prezzo1 - Prezzo2;
Stampa ("Prezzo1="+Prezzo1, " Prezzo2="+Prezzo2);
if (Spread==0){t=f; break;}
}
Prezzo12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT);
Prezzo22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t)) / MarketInfo(Symbol_2, MODE_POINT);
Spread2 = Prezzo12 - Prezzo22;


se (MathAbs(Spread2) >= razdvizka && Spread2 < 0) { aprire il trade }


vuole fissare la barra in cui lo spread era uguale a zero e controllare lo spread a partire da essa

se(MathAbs(Spread)<eps) { ........ } e hai ancora bisogno di controllare il risultato - se il punto che soddisfa la condizione viene trovato o meno. IMHO è meglio creare una funzione separata, per esempio, come questa:

int GetBarNumWithZerroDist(string Smbl1, string Smbl2, double K, double eps=0.00001)
{
int i=1;
double Smb1Cl0 = NrmalizeDouble(iClose(Smbl1,0,0));
double Smb2Cl0 = NrmalizeDouble(iClose(Smbl2,0,0));
double Smb1Pnt = MarketInfo(Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo(Smbl2, MODE_POINT);
int    mBars   = MathMin(iBars(Smbl1), iBars(Smbl2));

    for (i=1;i<mBars;i++) 
    {
        double Price1 =   (Smb1Cl0 - iClose(Symbol_1,0,i)) / Smb1Pnt;
        double Price2 = K*(Smb1Cl0 - iClose(Symbol_2,0,i)) / Smb2Pnt;
        double Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)< eps) return(i);
    }
    return(-1);
}
 

Salve.

Sapete se c'è una #proprietà negli indicatori che permette all'indicatore di mostrare sempre lo stesso periodo, per esempio d1?

e non cambia anche se si cambia timeframes in MetaTrader?

grazie

------------------------------------------

oh... quanti pros.....

 

aiuto!!!!

come chiamare l'indicatore dallo script, ho davvero bisogno che venga visualizzato in una finestra

 

Buona sera, per favore aiutatemi a fare delle modifiche al codice dell'EA:
1. Quando si testa tutto va bene - ma quando si fa trading il primo trade deve essere aperto manualmente, stop e take anche. Vorrei che l'EA iniziasse a negoziare automaticamente quando il prezzo arriva a un nuovo tick.
2. Poiché nel caso di uno stop loss innescato, la posizione successiva viene aperta con il doppio del lotto precedente, il lotto può teoricamente aumentare all'infinito (nel mio caso, fino a 51,2), vorrei limitarlo (ad esempio 0,8) con la possibilità di cambiare la soglia. Quando la soglia viene raggiunta e viene attivato uno stop, l'EA non si disconnette, ma riparte da 0,1.

//--- input parameters
extern double    Lot=0.1;
extern int       TP=22;
extern int       SL=20;
extern double    K_Martin=2;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0;
int closetime= 0,lastorder=0, tip=0;
for(int i=0;i<OrdersHistoryTotal();i++) /* Цикл перебора ордер*/
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; // Выбираем ордер из истории.
if(OrderMagicNumber()!=Magic) continue;
if(closetime<OrderCloseTime())
{
closetime = OrderCloseTime();
lastorder = OrderTicket();
tip=OrderType();
ol=OrderLots();
}
}
OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= (OrderClosePrice());
oop= (OrderOpenPrice());
osl= (OrderStopLoss());
otp= (OrderTakeProfit());
ol= (OrderLots());
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия ОРДЕРА--[",OrderOpenPrice(),"]"); 
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена закрытия ОРДЕРА--[",OrderClosePrice(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false )
{
if(tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend(Symbol(),OP_BUY,ol*K_Martin,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
}
if(tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point, Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
} 
if(tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend(Symbol(),OP_SELL,ol*K_Martin,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
}
if(tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
} 
}
return(0);
}

 
Top2n:

Aiuto, per favore. Ho lottato tutto il giorno senza alcun aiuto.

L'ordine è sul ritiro (Main BAY, in attesa di sellsstop come rete di sicurezza).

Alla chiusura sellsstop nel no-loss, rimandato di nuovo nello stesso posto.

Gira questa cosa,https://www.mql5.com/ru/code/8846.
 
7777877:


Per essere finalmente sicuro di aver capito bene, controlla i miei pensieri sul tuo ultimo paragrafo... Perciò, facciamo in modo che l'esperto di cui sopra sia presente:

Poi nella stringa:

Mettiamo una variabile di tipo intero Experts nella casella "GV-variable" per la memorizzazione (convertendola al tipo double). Allora se (ipotesi ipotetica) ci fosse una stringa nell'Expert Advisor

vorrebbe dire che c'è un comando per scrivere il risultato in una variabile di tipo int. In questo caso il compilatore:

* prenderebbe il valore della variabile di tipo double fuori dalla scatola,

* apportare le modifiche necessarie al valore della variabile Experts,

* assegnare questo valore alla variabile New_Experts e...

* mettere il valore della variabile New_Experts in una casella "int".

Quindi il tipo di variabile non è altro che un wrapper/pacchetto esterno di qualche valore? e quindi le variabili GV non possono essere di tipo stringa, poiché il downgrade è permesso solo per i valori numerici, e le stringhe non vengono convertite in numeri.

Giusto?

Grazie in anticipo per la risposta.

Non esattamente. Il punto è che la variabile Experts ha già il tipo int, quindi la conversione di tipo deve avvenire PRIMA di assegnarle un valore, cioè il compilatore

* ha preso fuori dalla scatola un valore di tipo double (non ha nome nel vostro programma, ed è scritto semplicemente a qualche indirizzo noto al compilatore nella memoria principale o nel registro della CPU)

* ha fatto tutte le modifiche necessarie al valore della variabile di cui sopra e ha scritto un nuovo valore (di tipo int!) nella variabile Experts,

* ha assegnato questo valore (di tipo int!) alla variabile New_Experts. Hanno lo stesso tipo, quindi si tratta solo di copiare un valore da una posizione di memoria all'altra.


P.S. È bello vedere che ci sono persone che comprendono le loro azioni in modo così dettagliato. Infatti, non scherziamo. Tenetevi in contatto.

 
Andrew1001:

Buona sera, per favore aiutatemi a fare delle modifiche al codice dell'EA:
1. Quando si testa tutto va bene - ma quando si fa trading il primo trade deve essere aperto manualmente, stop e take anche. Vorrei che l'EA iniziasse a negoziare automaticamente quando il prezzo raggiunge un nuovo tick.
Poiché nel caso di uno stop loss innescato, la posizione successiva viene aperta con il doppio del lotto precedente, il lotto può teoricamente aumentare all'infinito (nel mio caso, fino a 51,2), vorrei limitarlo (ad esempio 0,8) con la possibilità di cambiare la soglia. Quando la soglia viene raggiunta e viene attivato uno stop, l'EA non si disconnette, ma riparte da 0,1.


Provate:

extern double Lot=0.1,K_Martin=2,porog=0.8;
extern int TP=22,SL=20,Magic=233;
extern bool poz1_up=true;//ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true;//торговля разрешить?
bool fix;int init(){fix=true;return(0);}int deinit(){return(0);}
int start(){double oop,ocp,osl,otp,ol,lotos;int closetime=0,lastorder=0,tip=0;if(!Trade)return(0);
if(poz1_up&&fix){OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);fix=0;}  
if(!poz1_up&&fix){OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);fix=0;}
for(int i=0;i<OrdersHistoryTotal();i++)
  {if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
   if(OrderMagicNumber()!=Magic)continue;
   if(closetime<OrderCloseTime())lastorder=OrderTicket();}
if(OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip=OrderType();oop=OrderOpenPrice();osl=OrderStopLoss();
   otp=OrderTakeProfit();ol=OrderLots();ocp=OrderClosePrice();}
Print("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия--[",OrderOpenPrice(),
        "]--","цена закрытия--[",OrderClosePrice(),"]--","прибыль--[",OrderProfit(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==0)
  {if(tip==OP_SELL){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot; 
     OrderSend(Symbol(),OP_BUY,lotos,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}
     if(otp==ocp)OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(tip==OP_BUY){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot;
     OrderSend(Symbol(),OP_SELL,lotos,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(otp==ocp)OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}}return(0);}
//+------------------------------------------------------------------+
 
Salve. Puoi dirmi dove posso leggere come fare transazioni nel tester, da solo? Lo apprezzerei molto.