Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 18

 
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 toglierò da lì e lo dividerò per 100,0.

Sarà corretto?

Vuoi assegnare un numero magico ad ogni ordine?
 
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! Sarebbe molto interessante capire come lo fa esattamente.

OrderOpenPrice - prezzo di apertura dell'ordine, lo stesso (prezzo) è il rapporto di una valuta all'altra

AccountMargin - dà il margine totale del conto per tutti gli ordini aperti.

 
Vladimir Karputov:

Rinviato:

Vasiliy Danilov, 2016.12.02 07:18

Potete dirmi per favore cosa fare? Ho quasiscritto un semplice Expert Advisor usando un indicatore esterno, ma c'è un problema.

La chiusura di metà del lotto non funziona correttamente e l'ordine viene modificato per ogni tick.

Ecco il blocco di modifica da acquistare

if (CountBuy()>0) //In questa funzione viene calcolato 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); /qui cambio Stop in Breakeven
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");

} } }


Se SL != OrderStopLoss()) modifica .... Allora l'ordine sarà modificato solo se SL differisce dall'attuale OrderStopLoss.

E per capire cosa va storto alla chiusura, usate GetLastError(); in generale, sarebbe bene controllare OrderClose ... bool testOrCls

testOrCls=OrderClose ......

if(!testOrCls) Stampa (GetLastError() );

cioè se c'è un errore, chiediamo il codice di errore; se non c'è nessun errore, non chiediamo il codice di errore.


 
bablusut:

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 in cui stiamo cercando
stringaOrderStopLoss, OrderTakeProfit//cosa stiamo cercando
intstart_pos=0// da quale posizione iniziare la ricerca

);

... Se mi sbaglio, per favore correggetemi ...

Non funziona un po' così. Gli argomenti di questa funzione sono 1) la stringa che volete cercare; 2) la combinazione di caratteri che volete trovare; 3) l'inizio della ricerca (di default, dal carattere nullo della stringa secondo il passo 1).

Restituisce il numero di posizione nella stringa, in cui inizia la sottostringa cercata, o -1 se non viene trovata nessuna sottostringa.

In altre parole, scrivetelo così:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}
 
Renat Akhtyamov:

Hai un errore che chiude metà del lotto, quindi non è modificabile. Per favore, correggetelo secondo il mio post sopra.

Se vuoi farlo solo una volta, dovresti specificare il breakeven di un numero fisso di punti e aggiungere la condizione di controllo dell'ordine take profit per vedere se corrisponde a quel numero

E quando si passa attraverso una tale condizione nel blocco di modifica dell'ordine, la metà è chiusa.

Vasiliy Danilov:
Potete dirmi per favore cosa fare? Ho quasiscritto un semplice Expert Advisor usando un indicatore esterno, ma c'è un problema.

Se c'è OrederClose nel blocco, metà del lotto sarà chiuso immediatamente e OrderModify non funzionerà più.

Se rimuoviamo OrederClose, allora 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 chiudere metà dell'ordine quando il prezzo raggiunge il MinMove, e l'altra metà va a Breakeven una volta?

A proposito, ho appena prestato attenzione a OrderSelect per posizione SELECT_BY_POS, ma dov'è la selezione dei biglietti?

OrderClose(OrderTicket()

 
Babu Bonappan:

Per favore consigliate come usare MQL4 per ottenere un valore di margine per ogni posizione aperta nel terminale?

Lo facevo in questo modo:

margin = MarketInfo(Symbol(),MODE_LOTSIZE) * OrderOpenPrice() / AccountLeverage() * OrderLots();

Nel trading di EUR/USD questa costruzione ha funzionato bene ed ero sicuro che la sua logica fosse corretta.

Ma ora voglio ottenere lo stesso risultato per EUR/JPY (o EUR/CHF). Ovviamente, invece diOrderOpenPrice() ho bisogno di moltiplicare il valore di un lotto standard per il tasso della valuta di base alla valuta di deposito (nel mio caso, per EUR/USD). Ma qual è questo tasso? Il tasso di cambio che era al momento dell'apertura della posizione, o quello che abbiamo ora (al momento in cui vogliamo conoscere l'importo del deposito per questa posizione)?

No MODE_MARGINMAINTENANCE?

 
A1exPit:

A proposito, ho appena notato OrderSelect sulla posizione SELECT_BY_POS, ma dov'è il biglietto di selezione?

OrderClose(OrderTicket()

Non sai proprio niente in questo thread?

Se l'ordine è selezionato, allora OrderTicket() restituisce il biglietto dell'ordine selezionato. E non importa come viene selezionato l'ordine - per indice o per biglietto.

C'è una sottigliezza nel caso della selezione per biglietto - il pool non viene preso in considerazione, e dobbiamo controllare da quale lista viene selezionato l'ordine, controllando il tempo della sua chiusura.

 
Vasiliy Danilov:
Potresti per favore darmi qualche indicazione su come capire questo? Ho quasiscritto un semplice Expert Advisor usando un indicatore esterno, ma ho incontrato un problema.

Se c'è un OrederClose nel blocco, 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 per l'acquisto

   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 quando il prezzo raggiunge il livello MinMove e l'altra metà va a Breakeven una volta?

Quando la chiusura parziale del biglietto cambia. Prima a pareggiare, poi a chiudere.

O cambiare la logica.

 
Artyom Trishkin:

A1exPit:

A proposito, ho appena notato OrderSelect by SELECT_BY_POS , ma dov'è il ticket di selezione?

OrderClose(OrderTicket()

Non sai proprio niente in questo thread?

Se viene selezionato un ordine, allora OrderTicket() restituisce il biglietto dell'ordine selezionato. E non importa come viene selezionato l'ordine - per indice o per biglietto.

C'è una sfumatura quando si seleziona per ticket - il pool non viene preso in considerazione, e bisogna controllare da quale lista l'ordine viene selezionato controllando il tempo di chiusura.

E se guardiamo il codice in cui è stato scritto questo commento? Non è così semplice lì...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
 
Vitalie Postolache:

E se guardate il codice in cui è stato scritto questo commento? Non è così chiaro lì...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
Bene... Sì... Non ho guardato da vicino. Solo un assaggio. Non sono interessato a questo thread per qualche motivo
Motivazione: