Caratteristiche utili da KimIV - pagina 26

 
aceventura:

La funzione numero di ordini non funzionerà, perché l'EA è impostato diversamente per ogni coppia. E gli ordini sono impostati per diverse coppie allo stesso tempo. Quindi se vengono piazzati quattro ordini per due coppie e ne scatta uno, tre di essi vengono cancellati e quello opposto dovrebbe essere cancellato per tutte le coppie.

Tutte le funzioni di KimIV "filtreranno" gli ordini per tipo+coppia+magia. Cioè (per me! :) per non correre e cercare - da questa pagina "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) chiamando "Count there some" Sicuramente otterrai i veri ordini aperti per questa coppia di valute o anche con questo EA.

Intendevo la funzione

int NumberOfOrders(string sy="", int op=-1, int mn=-1)

da pagina 12.

 
SergNF:

Tutte le funzioni di KimIV "filtrano" gli ordini per tipo+coppia+magia. Cioè (a me! :) per non correre e cercare - da questa pagina "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) chiamando "Count there some" Sicuramente otterrai il numero reale di ordini aperti su questa coppia o anche con questo EA.

ZS Intendevo la funzione

da pagina 12.

Grazie! Molto utile! Ci darò un'occhiata.

 
Mi scuso per l'intrusione Help for Dummies Come disegnare linee parallele in MT4 velocemente e comodamente?
 
extern double Lots = 0.1;
extern double TrailingStop = 10;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
Per favore, aiutatemi. Ho messo insieme un semplice EA utilizzando un trailing stop.

Come fare trailing stop è stato messo una volta +5 pips e non trasferito ulteriormente, la chiusura è stata fatta da

Come posso usare il trailing stop se è già impostato dagli indicatori? Se puoi fare un esempio!!!
 
KimIV писал (а) >>

Probabilmente no... Ne ho solo due: indice e presa... >> hee

Igor, ho una cotta per te, anche se non sono gay. Dopo tutto, puoi lavorare anche come Zadornov.

 

Funzione SecondsAfterOpenLastPos().

Questa funzione restituisce il numero di secondi dall'apertura dell'ultima posizione. 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. Il valore nullo indica 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 di -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
P.S. In allegato c'è uno script per testare la funzione SecondsAfterOpenLastPos().
 

Sono naturalmente selvaggiamente dispiaciuto, quello che state facendo è certamente una buona cosa.

Ma COME lo fai, non mi piace per niente.

1. il fatto che tu descriva i nomi delle variabili è fantastico, ma ogni volta che devi guardare nell'intestazione per vedere cosa significa la prossima abbreviazione selvaggia, è difficile capire cosa significa la variabile, ti dimentichi cosa volevi scoprire nel codice. Non puoi scrivere un codice auto-documentato di QUALITÀ, che anche senza commenti sarà comprensibile a qualcuno che conosce l'inglese, soprattutto perché lo stai facendo per altri e altri con questa qualità non troveranno mai un errore nel codice, se ce n'è uno.



2. Funzioni sovraccaricate. La versatilità è una brutta cosa, 6 parametri per una funzione sono troppi.



3. Semplicità del codice

Esempio.

datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

Questo è il vostro codice. Vediamo cosa ci si può fare:

datetime SecondsAfterOpenLastPos(string symbol = "", int type = -1, int magic = -1) 
{
  datetime nearestTime = 0; // Инициализировать не надо? Самые сложно находимые ошибки.
  int count = OrdersTotal();
 
  if (symbol == "0") 
     symbol = Symbol();
 
  for (int i = 0; i < count; i++) 
  {
     // invalid select    
     if (!OrderSelect(i, SELECT_BY_POS)) continue;
     
     // not needed symbol     
     if (OrderSymbol() != symbol && symbol != "") continue;
 
     int currentType = OrderType();
 
     // only active orders are checked     
     if (currentType != OP_BUY && currentType != OP_SELL) continue;
     
     // type doesn't pass     
     if (type > 0 && currentType != type) continue;
 
     // magic number doesn't pass     
     if (magic > 0 && OrderMagicNumber() != magic) continue;
 
     if (nearestTime < OrderOpenTime()) nearestTime = OrderOpenTime();
  }
 
  return (TimeCurrent() - nearestTime);
}

Vogliamo confrontare il codice? Fa la stessa cosa.

1. Sì, il mio codice è più grande, ma dopo tutto, non viviamo nell'era dei floppy disk, non c'è abbastanza spazio?

2. Il mio codice è molto più chiaro all'interno. Anche senza i commenti, che sono incollati sul posto.

3. La tua funzione ha nidificazione 7, la mia ha 2, c'è una differenza?

4 È una delle poche funzioni che non è sovraccaricata, ma aprire, modificare e così via è un incubo.



SZZH: Rispetta le persone per cui stai scrivendo.

 

Но КАК вы это делаете, мне абсолютно не нравится.

-1. Non sono d'accordo. Assolutamente a posto con tutto, sia nella forma che nel contenuto. Si prega di continuare esattamente nello stesso formato.

Sì, il mio codice è più grande.

Esattamente. E più il codice è piccolo, più è facile da leggere. Odio i font "spalmati" su 2-3 schermi. Una funzione dovrebbe essere tutta in una schermata, senza doverla sfogliare. Ecco perché sono per la compattezza.

La tua funzione ha nidificazione 7, io ne ho 2, c'è una differenza?

Va bene che ci siano molti continuum opzionali che, tra l'altro, allontanano di nuovo l'attenzione del lettore?

 
Andrei(TheXpert), grazie per i tuoi commenti e suggerimenti! Tutti sono assolutamente giusti e avete assolutamente ragione nelle vostre affermazioni!
 

Funzione DeleteOppositeOrders().

Questa funzione cancella uno o più ordini opposti alla posizione, il cui tipo è specificato nel parametro op. Per esempio, per una posizione Buy gli ordini opposti sarebbero SellLimit e SellStop. La cancellazione dell'ordine opposto diventa necessaria se, per esempio, sono impostati due ordini opposti e uno di essi scatta.

  • sy - Nome dello strumento di mercato. Se impostate questo parametro, la funzione considererà solo le posizioni del simbolo specificato. Il valore predefinito "" significa qualsiasi strumento di mercato. Il valore nullo indica 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 di -1 significa qualsiasi identificatore.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}
SZZ. In allegato c'è uno script per testare la funzione DeleteOppositeOrders().