Caratteristiche utili da KimIV - pagina 7

 

Bene, visto che non ci sono domande, continuiamo...

Funzione ModifyOrder().

La funzione ModifyOrder è progettata per cambiare uno o più livelli di prezzo di un ordine preselezionato. Qui un ordine pendente è inteso come un ordine Limit o Stop, così come un ordine di Acquisto o Vendita a mercato, cioè una posizione. Utilizzando la funzione ModifyOrder è possibile modificare due livelli di prezzo StopLoss e TakeProfit per la posizione, mentre per l'ordine pendente è possibile modificare anche il prezzo di impostazione OpenPrice. I livelli di prezzo modificati sono passati alla funzione ModifyOrder come parametri. Se uno dei parametri è negativo, il livello di prezzo corrispondente non sarà modificato.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}
 

Esempi di come usare la funzione ModifyOrder().

Ho deciso di fare i primi esempi che mi sono stati chiesti molte volte. Questa è l'apertura di posizioni in termini di esecuzione degli ordini di mercato Market Watch. È quando non possiamo dare simultaneamente un ordine per aprire una posizione al prezzo di mercato e allegare un ordine pendente ad esso. Un'apertura di questo tipo a Market Watch deve essere eseguita in due fasi: prima si apre una posizione e poi si allega un ordine pendente ad essa, cioè si impostano i livelli di prezzo StopLoss e TakeProfit.

1. Comprare 0,1 lotti del simbolo corrente e impostare uno stop di 30 punti

int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Ask-30*Point, -1, clModifyBuy);

2. Vendi 0,15 lotti dello strumento corrente e imposta SL=45, TP=99

int ti=OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);
Una sceneggiatura di lavoro con esempi è inclusa nel trailer.
File:
 
Igor, hai una funzione di ordine di chiusura (sia solo Close che CloseBy)?
 
Lukyanov:
Igor, hai una funzione per chiudere gli ordini (sia solo Close che CloseBy)?
Close c'è, CloseBy no.
 
Chiudere in ordine alfabetico dovrebbe essere prima di ModifyOrder ;-)
 
Lukyanov:
Chiudere in ordine alfabetico dovrebbe essere prima di ModifyOrder ;-)
Sì, proprio così... Prima apri, poi modifica e infine chiudi ;-)
 

Ha senso... ;)

Considererebbe sfacciato fare una piccola libagione di un solo post sul tema "Trasmissione per funzionare"?
Finora è una selva oscura logico-ideologica per me...
(no, non lo è...).

 
kombat писал (а):
Considereresti sfacciato avere un po' di educazione in un solo post sul tema "Trasmissione alla funzione"?
No, non lo farei. Per quanto riguarda le mie funzioni, qualsiasi domanda è accettabile in qualsiasi momento. Cercherò di rispondere a tutti...
 

Grazie...
E naturalmente non c'è fretta... non c'è fretta.
Il mercato non scapperà da noi... :)))

 
kombat писал (а):
Grazie...
E naturalmente non c'è fretta... non c'è fretta.
Il mercato non scapperà da noi... :)))
In realtà mi aspettavo delle domande da parte tua. Domande specifiche, indicando direttamente ciò che avete bisogno di chiarire sull'uso delle mie funzioni.
Motivazione: