Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 17

 
Babu Bonappan:

OrderOpenPrice, come ho capito, mi dà esattamente ciò di cui ho bisogno. Ma solo se la valuta del deposito è USD e la coppia scambiata è EUR/USD. In questo caso, è come se l'OrderOpenPrice memorizzasse il tasso di cambio tra la valuta di base e la valuta di deposito al momento dell'apertura dell'ordine sapendo che si può facilmente calcolare il deposito.

Ma se almeno una di queste condizioni non è soddisfatta, come possiamo ottenere il valore del deposito per un ordine individuale? Dove possiamo trovare il tasso della valuta di base di una quotazione rispetto alla valuta del deposito al momento della sua apertura?

Sì, abbiamo il tempo di apertura dell'ordine al secondo più vicino. Ma cosa possiamo ottenere? Al massimo - i parametri della candela minuta del simbolo richiesto. Ma mai il valore esatto del tasso utilizzato per il calcolo del deposito. Ma la funzione AccountMargin lo ottiene in qualche modo! Mi piacerebbe molto capire come fa esattamente.

Avete bisogno di tre formule per calcolare il margine.

A seconda della valuta del tuo deposito, calcolerai il margine per qualsiasi coppia di valute.

È possibile che ci sia un errore nel calcolo. Ma sarà molto più piccolo di quello che apparirà quando si arrotonda il risultato del calcolo al centesimo di unità della valuta di base del deposito, cioè se è un dollaro, allora voglio dire centesimi.

PS

AccountMargin è l'attuale, cioè l'ultimo valore

 

E se ottengo il valore esatto del margine al momento dell'apertura dell'ordine usandoMarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot- avrà sempre due cifre decimali, giusto? Poi lo moltiplico per 100 e lo salvo come MagicNumber di questo ordine. E se necessario, lo tiro fuori da lì e lo divido per 100,0.

Sarà corretto?

 
Babu Bonappan:

E se ottengo il valore esatto del margine al momento dell'apertura dell'ordine usandoMarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot- avrà sempre due cifre decimali, giusto? Poi lo moltiplico per 100 e lo salvo come MagicNumber di questo ordine. E se necessario, lo tiro fuori da lì e lo divido per 100,0.

Sarà corretto?

Di nuovo, non è a questo che serve il MagicNumber. Sarebbe meglio scriverlo in un file di log e poi leggerlo.

Tutto dipende dallo scopo di tale calcolo e dal numero di ordini per cui il programma è progettato.

Mi sembra che calcoli così precisi siano necessari solo per un broker o una società di intermediazione.

Da questo punto di vista, la soluzione ottimale sarebbe la registrazione.

 
Vitaly Muzichenko:

Perché stai mentendo sul numero di segni? Non ingannare la gente.

Ha.

Non ha mai sentito parlare di conteggio ad alta precisione?

 

Rinviato:

scritto un semplice Expert Advisor usando un indicatore esterno, ma c'è un problema.

La chiusura di mezzo lotto non funziona correttamente e l'ordine viene modificato ad ogni tick.

Ecco il blocco di modifica da acquistare

if (CountBuy()>0) //Questa funzione conta il numero di ordini di acquisto
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ se (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //se il prezzo ha superato il movimento richiesto dall'indicatore
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Cambia Stop in Breakeven qui
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //provo a chiudere metà del lotto
Print("Errore di chiusura della metà del lotto da comprare");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //qui sposto la parte rimanente a Breakeven
Print("Errore di modifica al pareggio sull'acquisto");

} } }


 
Vladimir Karputov:

Ripubblicato:

Vasiliy Danilov, 2016.12.02 07:18

Per cominciare, provate a usare NormalizeDouble(OrderLot()/2,2) invece di Lots/2

E incolla il codice nel post tramite il pulsante "SRC" per renderlo leggibile

 
Potete per favore darmi qualche consiglio su come affrontare questo problema. Ho quasiscritto un semplice Expert Advisor usando un indicatore esterno, ma ho incontrato un problema.

Se il blocco ha OrederClose - metà del lotto viene chiuso immediatamente e OrderModify non funziona più.

Se rimuoviamo OrederClose, OrderModify modifica l'ordine per ogni tick

Ecco il blocco di modifica da acquistare

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
Come posso chiudere una metà dell'ordine e far andare l'altra metà a Breakeven una volta se il prezzo raggiunge il MinMove?
 
Vasiliy Danilov:
Potresti darmi un suggerimento? Ho quasiscritto un semplice Expert Advisor usando un indicatore esterno, ma c'è un problema.

Se hai OrederClose nel blocco, chiude immediatamente metà del lotto e OrderModify non funziona più.

Se rimuovi OrederClose, OrderModify modificherà l'ordine ad ogni tick

Ecco il blocco di modifica da acquistare

   if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
   { for (int i = OrdersTotal() -1; i>=0; i--)
     { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
      SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
       if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print("Ошибка закрытия половины лота на покупку");
      if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
       Print("Ошибка модификации в безубыток на покупку");

   }    }   }
Come dovrei chiudere una metà dell'ordine e rendere l'altra metà Breakeven una volta se il prezzo raggiunge il MinMove?

Avete un errore di chiusura della metà del lotto, quindi non si modifica. Per favore, correggetelo secondo il mio post sopra.

E per farlo una volta, bisogna impostare il breakeven a un numero fisso di punti e aggiungere la condizione di controllo del take profit dell'ordine al fatto di rispettare questo numero

E quando il prezzo passa attraverso tale condizione nel blocco di modifica dell'ordine, metà dell'ordine dovrebbe essere chiuso

 
Alexey Kozitsyn:
No. Cerca di capire cosa stai facendo. Quello che hai scritto è solo un prototipo della funzione (cioè solo una descrizione di ciò che fa). Quindi l'hai semplicemente strappato dalla documentazione. Dovete usarlo. Quindi dovete sostituire i vostri valori con gli argomenti. E la funzione restituirà il risultato. Poi questo risultato deve essere elaborato.

Grazie per la risposta ... Ho cercato in mezzo a Internet, ci sono pochissimi esempi di utilizzo della funzioneStringFind, e da quello che ho trovato ho concluso che i parametri devono essere

intStringFind(

stringcomment =OrderComment()// La stringa dove stiamo cercando
stringaOrderStopLoss, OrderTakeProfit//cosa stiamo cercando
intstart_pos=0// in quale posizione iniziare la ricerca

);

... Se mi sbaglio, correggetemi ...

 
Vitaly Muzichenko:

Perché stai mentendo sul numero di segni? Non ingannare la gente.

Ogni broker ha un punto di vista diverso
Motivazione: