Caratteristiche utili da KimIV - pagina 88

 

kombat 17.07.2009 22:13

Sommare, ottenere buy-summer 3 lotti e contrastare questo volume vendere 3 lotti

.......................

Come opzione, sì. Anche se, se ci sono già ordini di vendita aperti, l'EA potrebbe chiudere non quelli di cui hai bisogno. Dovrebbe essere risolto.

kombat 17.07.2009 22:13.

Ma per rispondere alla sua domanda: è possibile chiudere tutte le posizioni?

sì, uno per uno, è uno script veloce, aap! e questo è tutto...

.........................

Questo è quello che sto usando ora. Un insieme di script - si usa questo, poi quello... Ma ho provato a codificare la mia strategia in Expert Advisor e ho incontrato una serie di difficoltà.

 
gince >> :
Ho qualcosa che non funziona qui, significa che non chiude nessun errore.

Nella funzione ClosePositions(), la sua libreria b-Positions.mqh, KimIV usa una chiamata alla sua altra funzione ClosePosBySelect() che vieta l'uso di ee nel tester:

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


Per i test di storia usa la sua libreria b-ForTest.mqh

 
BoraBo писал(а) >>

Nella funzione ClosePositions(), la sua libreria b-Positions.mqh, KimIV usa una chiamata alla sua altra funzione ClosePosBySelect() che vieta l'uso di ee nel tester:

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

Per i test di storia, usa la sua libreria b-ForTest.mqh

Hai frainteso il mio codice... Tradurre in russo... Se NON è in modalità test E (l'EA non è autorizzato a scambiare o l'Expert Advisor è fermo), allora interrompi il ciclo. Per dirla semplicemente, questa linea assicura l'uscita dal ciclo, quando si preme il pulsante "Expert Advisors" sulla barra degli strumenti.

 
Mi dispiace per la confusione.
 

Buona sera,

Sfortunatamente, c'è anche una discrepanza con l'array... Quando il conteggio degli ordini è fatto con una condizione se i lotti sono più grandi di 0 (Lts>0), i lotti sono chiusi uno per uno (quando il profitto è stato raggiunto), ma il profitto totale dovrebbe essere preso in considerazione:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>0)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

E alla condizione nel conteggio degli ordini, se i lotti sono più di 1 (Lts>1), i lotti non sono chiusi:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>1)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

Si prega di avvisare chi può vedere l'errore.

O forse, Igor, ho un'incomprensione nell'uso della tua funzione?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Chiama la funzione

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()== sy || sy=="") && ( op<0 || OrderType()== op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( mn<0 || OrderMagicNumber()== mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return( p);
}
 

Igor, per favore dimmi come inserire la tua funzione PriceOpenLastPos nell'indicatore.

Durante la compilazione l'editor dà errore sulla prima parentesi e sulle variabili successive.

double PriceOpenLastPos( string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int k=OrdersTotal();

if (sy=="0") sy=Symbol();
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 (t<OrderOpenTime()) {
t=OrderOpenTime();
r=OrderOpenPrice();
}
}
}
}
}
}
}
return(r);
}
}

'(' - definizione di funzione inattesa D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - variabile non definita D:\MT4\experts\indicators\Astrea.mq4 (632, 7)
etc.

Implemento la logica di formazione dei segnali di trading in un indicatore e invio il segnale generato all'Expert Advisor tramite una variabile globale per aprire/chiudere gli ordini.

Ho bisogno del prezzo aperto di un ordine per prendere alcune decisioni, quindi sto cercando di farlo. Il mio indicatore è dinamico e può essere debuggato solo in modalità demo o in modalità visualizzazione in un tester.

 

Il quadro è che non è il profitto totale che viene preso in considerazione, ma il profitto dei singoli ordini.

 
Angela, il compilatore non si aspettava di trovare la mia definizione di funzione in questo posto particolare. Significa che da qualche parte più in alto nel codice manca qualcosa. Forse un punto e virgola o una parentesi graffa di chiusura. Comunque, controlla il codice con attenzione.
 
hope писал(а) >>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Chiamata di funzione

Passaggio errato di parametri nella funzione. Dovrebbe essere così:

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >> :

Passaggio errato di parametri nella funzione. Dovrebbe essere così:

Aggiungere un binding al simbolo nella chiamata di funzione non aiuta. Perché conta il profitto per ogni posizione separatamente (immagine sopra)?