Caratteristiche utili da KimIV - pagina 21

 

La funzione isCloseLastPosByStop().

Questa funzione restituisce una bandiera per chiudere l'ultima posizione per stop. La bandiera è alzata - Vero - StopLoss è scattato. Flag abbassato - Falso - la posizione è stata chiusa per un altro motivo. Una selezione più accurata delle posizioni da prendere in considerazione è impostata utilizzando parametri esterni:

  • sy - Nome dello strumento di mercato. Se questo parametro è impostato, la funzione considererà solo le posizioni dello strumento specificato. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
P.S. In allegato c'è uno script per testare la funzione isCloseLastPosByStop().
 
Lukyanov:
KimIV:

Funzione OpenPosition() per l'online.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
//-- skip --
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
//-- skip -- 
Inserito la funzione OpenPosition() in EA su real, errore 4059, cambiato NULL in Symbol(), scomparso, poi è apparso il messaggio
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: esperto fermato
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: le chiamate di funzioni esperte non sono consentite; 'stdlib'-'ErrorDescription'
Tornando alla linea di base, tutto funziona... (stdlib.mqh && stderror.mqh sono nella cartella include della consegna base di MT)
 
teraptor2 писал (а):
Ho collegato la funzione OpenPosition() nel mio Expert Advisor sul reale, l'errore 4059

L'errore 4059 significa che la funzione non è disponibile in modalità test. L'identificatore di errore è ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE. Le seguenti funzioni generano l'errore: MarketInfo, MessageBox, SendFTP, SendMail, WindowIsVisible, WindowFind, WindowHandle.

teraptor2 ha scritto (a):
ha cambiato NULL in Symbol(), è scomparso, poi è apparso un messaggio
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: esperto fermato
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: le chiamate di funzioni esperte non sono consentite; 'stdlib'-'ErrorDescription'
 

La funzione isCloseLastPosByTake().

Questa funzione restituisce una bandiera per chiudere l'ultima posizione al Take Profit. La bandiera è su - Vero - TakeProfit è scattato. Flag abbassato - Falso - la posizione è stata chiusa per un altro motivo. Una selezione più accurata delle posizioni da considerare è specificata utilizzando parametri esterni:

  • sy - Nome dello strumento di mercato. Se impostate questo parametro, la funzione considererà solo le posizioni dello strumento specificato. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
HH. In allegato c'è uno script per testare la funzione isCloseLastPosByTake().
 

La funzione isLossLastPos().

Questa funzione restituisce il flag di perdita dell'ultima posizione chiusa. Flag up - True - l'ultima posizione è stata chiusa con una perdita. Flags down - Falso - l'ultima posizione è stata chiusa a zero o con un profitto. Questa funzione non considera gli swap e le commissioni. La selezione delle posizioni è definita da parametri esterni:

  • sy - Nome dello strumento di mercato. Se si specifica questo parametro, la funzione considererà solo le posizioni dello strumento specificato. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг убыточности последней позиции.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    if (OrderProfit()<0) return(True);
  }
  return(False);
}
P.S. In allegato c'è uno script per testare la funzione isLossLastPos().
File:
 

La funzione isTradeToDay().

Questa funzione restituisce la bandiera commerciale per oggi. Flag è su - Vero - c'erano posizioni aperte oggi. Flag down - Falso - nessuna posizione aperta oggi. La selezione delle posizioni da prendere in considerazione è impostata da parametri esterni:

  • sy - Nome dello strumento di mercato. Se questo parametro è impostato, la funzione considererà solo le posizioni dello strumento specificato. Il valore predefinito "" significa qualsiasi strumento di mercato. NULL significa lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione, MagicNumber. Il valore predefinito -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
ZZY. In allegato c'è uno script per testare la funzione isTradeToDay().
File:
 
KimIV:

La funzione isCloseLastPosByStop().

Questa funzione restituisce una bandiera per chiudere l'ultima posizione per stop. La bandiera è alzata - True - StopLoss è scattato. Flag abbassato - Falso - la posizione è stata chiusa per un altro motivo. Una selezione più accurata delle posizioni da prendere in considerazione è impostata utilizzando parametri esterni:

().

Pomeriggio . Quando si implementa il codice con questa funzione, è apparsa un po' di confusione. Ho applicato questa funzione in questo modo:

if (isCloseLastPosByStop(NULL,OP_BUY, MagicLong1))               {
//если одна из открытых позиций BUY вдруг закрылась по стоплосу   
  for ( int rb_ = OrdersTotal() - 1; rb_ >= 0; rb_ -- )                {       
      if (OrderSelect(rb_, SELECT_BY_POS, MODE_TRADES))                 { 
      //выбираем среди открытых и отложенных ордеров          
      if( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicLong1))  {
         //закрываем все остальные позиции BUY
        OrderClose(OrderTicket(),OrderLots(),Bid,ОтклонениеЦены,Black );
       OrderDelete(OrderTicket());// и удаляем BUY-отложки   
        //  return(0); // выходим     
        }}}}

Fino a questo punto tutto funziona bene! Tutte le posizioni BUY sono chiuse e le posizioni BUY sono cancellate, come l'ho definito! Ma poi l'Expert Advisor reimposta gli ordini pendenti secondo i suoi segnali di entrata. Come previsto.

Ma questi ordini vengono immediatamente cancellati! A quanto pare, la bandiera è ancora appesa lì. Ma perché è lì? Le ultime posizioni non sono state chiuse da uno Stop Loss ma dalla forza!

Come devo affrontare questa situazione? Come posso fare in modo che il mio Expert Advisor visualizzi i suoi prossimi ordini normalmente dopo l'esecuzione del comando di chiusura di questo algoritmo?

 
rid писал (а):
Cosa devo fare in questa situazione? In modo che l'EA possa piazzare i suoi prossimi ordini normalmente dopo il comando di chiusura?

Questa domanda deve essere affrontata nel contesto dell'intero compito, perché non è solo una singola azione, ma un'interazione, e in un certo ordine. Perciò, descrivete il compito per intero. Non hai bisogno di un codice. Basta descrivere il compito a parole.

Domanda di riscaldamento. Perché devi cancellare gli ordini e rimetterli a posto? Penso che sia preferibile modificare.

 

I miei ordini e le mie posizioni sono raggruppati in array secondo i profitti, le perdite, gli ordini stop e limit, e altre ragioni.

In questo caso particolare, sto chiudendo l'array di posizioni BUY che sono state aperte con ordini stop e che hanno accumulato un determinato profitto. E cancello tutti gli altri ordini di stop che non hanno funzionato.

//---------------------------------------------------------------------------------------------

 

Ora ho messo una funzione di commento - Comment (isCloseLastPosByStop());

Guardando. Inizialmente, la funzione =0. Dopo la prima chiusura di uno Stop Loss Comment (isCloseLastPosByStop()); cambia a uno, e poi - dopo la chiusura forzata di altre posizioni, non ritorna a zero, ma continua ad essere uno!