Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 189

 
Youri Lazurenko:

Ho fatto così - aprendo un ordine con zero TP e SL, e poi modificando (l'ordine) con i parametri TP e SL richiesti. Ho già scritto, tutto funziona e ha funzionato bene su altri account, solo su ndd tale cosa. Non ho lavorato con nessun altro con conti simili prima, non posso fare confronti. Forse è solo il bleeping di forex4u, o forse tutti gli account ndd. Vorrei saperlo per riferimento futuro.
Dato che hai un errore di 130, allora guarda i parametri dell'ordine di stop. In ogni caso, non dovrebbero essere più vicini al valore di StopLevel impostato nelle impostazioni del server. Se è uguale a zero, allora usate il doppio punto di spread+1
 
Youri Lazurenko:

Ho fatto così - aprendo un ordine con zero TP e SL, e poi modificando (l'ordine) con i giusti parametri TP e SL. Ho già scritto, tutto funziona e ha funzionato bene su altri account, solo su ndd tale cosa. Non ho lavorato con nessun altro con conti simili prima, non posso fare confronti. Forse è solo il bleeping di forex4u, o forse tutti gli account ndd. Mi piacerebbe saperlo per il futuro.

Quando aprite le posizioni, usate queste funzioni per calcolare gli stop e i take corretti:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
 
Alexey Viktorov:

Qual è la differenza

Pips = Charge/Lots/Tickvalue in cifre specifiche 8/2/4 = 1

o

Pip = Carica/(Lotti*Tickvalue) in numeri specifici 8/(2*4) = 8/8 = 1

I numeri frazionari possono anche essere usati...


La differenza è che il mio omonimo moltiplica anche perPoint per qualche ragione:(OrderCommission()/(tv*OrderLots()))*Point()
 
Artyom Trishkin:
Se hai l'errore 130, allora guarda i parametri dell'ordine di arresto. In ogni caso, non devono essere più vicini al valore StopLevel impostato nelle impostazioni del server. Se è uguale a zero, allora usate il doppio spread + 1 punto


Grazie mille per le caratteristiche date, nel vostro prossimo post.

Il fatto è che non ho alcuno stop impostato (media). E perché questo errore non è presente quando avvio il terminale al mattino e la modifica si verifica, ma solo presente (errore) all'inizio della sessione quando si apre un ordine (grafici giornalieri) e se è uno su una coppia. Il supporto tecnico ha risposto che non ci sono limitazioni per questa modifica né in tempo né in distanza (lo spread non è importante).

Cercherò di fare alcuni esperimenti con tutte le raccomandazioni e trarrò le mie conclusioni più tardi.

Grazie mille ancora una volta.

 
Vitalie Postolache:

La differenza è che il mio omonimo moltiplica anche per Point per qualche ragione:(OrderCommission()/(tv*OrderLots()))*Point()

OK, ti rispondo: c'è un prezzo di 1,0520, nei calcoli abbiamo ottenuto il numero (int)Comm, quindi dobbiamo aggiungerlo/sottrarlo dal prezzo = 1,0520 + (int)Comm ? Ora, per non moltiplicare per Punto - questo viene fatto immediatamente.

 
Youri Lazurenko:


Grazie mille per le caratteristiche date, nel vostro prossimo post.

Il fatto è che non ho affatto impostato degli stop (media). E perché questo errore non è presente quando avvio il terminale al mattino e la modifica si verifica, ma solo presente (errore) all'inizio della sessione quando si apre un ordine (grafici giornalieri) e se è uno su una coppia. Il supporto tecnico ha risposto che non ci sono limitazioni per questa modifica né in tempo né in distanza (lo spread non è importante).

Cercherò di fare alcuni esperimenti con tutte le raccomandazioni e trarrò le mie conclusioni più tardi.

Grazie mille ancora una volta.

Non c'è di che.

Per usarlo in questo modo: nella funzione di apertura della posizione, invece dello stop in pip, copiate la funzione call, in cui mettete lo stop in pip. Oppure il prezzo di stop dovrebbe essere inserito direttamente - il compilatore selezionerà la funzione richiesta. Lo stesso per il take profit.

Esempio:

double price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);         // Цена открытия для Buy
double sl=CorrectStopLoss(Symbol(), OP_BUY, price, 200);    // Стоп в 200 пунктов (вместо пунктов можно вписать расчётную цену, например Ask+200*Point() или значение цены МА)
double tp=CorrectTakeProfit(Symbol(), OP_BUY, price, 300);  // Тейк в 300 пунктов (если вписать расчётную цену, то будет использоваться тип функции с double-параметром)
OrderSend(Symbol(),OP_BUY,Lots,price,slippage,sl,tp,"Комментарий ордера",Magic,0,clrBlue);
 
Vitaly Muzichenko:

OK, ti rispondo: c'è un prezzo di 1,0520, nei calcoli abbiamo ottenuto il numero (int)Comm, quindi dobbiamo aggiungerlo/sottrarlo dal prezzo = 1,0520 + (int)Comm ? Ora, per non moltiplicare per Punto - questo viene fatto immediatamente.


Beh, allora forse sì. È solo che la domanda era originariamente posta su come tradurre la commissione in pip, non in prezzo.
 
Artyom Trishkin:

Non c'è di che.

Usate questo modo: nella funzione per aprire una posizione al posto dello stop in pip, digitate la chiamata della funzione in cui volete sostituire lo stop in pip. Oppure il prezzo di stop dovrebbe essere inserito direttamente - il compilatore seleziona la funzione richiesta. Lo stesso per il take profit.

Esempio:

Ancora una volta, grazie mille. Tutto il meglio.
 
Si prega di consigliare Egregi Signori: io disegno linee di Fibonacci con diversi colori e livelli di stile e sempre impostato lo stesso come l'ultimo, come risolvere il problema?

                  ObjectCreate(0,Fibo_Arrow,OBJ_FIBO,0,Time[0],Close[0],Time[0],price); // создание метки стпа на графике   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_HIDDEN,true);        // Запрет на показ имени графического объекта в списке объектов 
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_SELECTABLE,false);   // запрет на выделение перемещение объекта мышью   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_RAY_RIGHT,false);    // луч вправо
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_TOOLTIP,"r\n");       // подпись линии и и её длины в подсказку                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_COLOR,1,clrNONE);       // цвет   
                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELS,3);           // установим количество уровней   
                      
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,0,1.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,0,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,0,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,0,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,0,"0.5"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,1,2);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,1,Lime);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,1,0);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,1,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,1,"1"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,2,2.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,2,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,2,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,2,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,2,"1.5"); // описание уровня 
 
Money_Maker:
Cari esperti, per favore consigliate: costruisco linee di Fibonacci con diversi colori e stili di livelli, ma sempre impostati come l'ultimo, come risolvere? ridisegnare e scivolare non è utile in nessun posto(

Livelli di Fibo con questo oggetto, non puoi fare stili e colori diversi per ogni linea. Disegna linee separate se vuoi un arcobaleno.