[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 832

 
Vinin:

Cosa cambierà la prossima volta?
La stessa cosa. Si chiude una posizione - si imposta un ordine pendente, ecc. C'è una funzione che restituisce l'ultimo valore (per esempio OrderCloseTime()). Ad ogni tick, ottengo il valore temporale dell'ultima posizione chiusa (diciamo la posizione #1). Quando chiudo la posizione successiva (posizione #2) con un nuovo tick ottengo il tempo per chiudere questa (#2) posizione. Il valore di OrderCloseTime() è cambiato rispetto al precedente. E così via. Non mi interessa come o quanto la variabile sia cambiata. Ciò che conta per me è il fatto stesso che la variabile sia cambiata. È come un'operazione logica: se l'OrderCloseTime() dell'ultima posizione chiusa è maggiore dell'OrderCloseTime() della penultima, allora dovremmo fare BLA-BLA-BLA. Inoltre - se l'OrderClosePrice() dell'ultima posizione chiusa non è uguale all'OrderClosePrice() della penultima, allora fate un BLA-BLA-BLA. O forse non è possibile fare un tale confronto?
 
Ecco la domanda. Supponiamo, per esempio, che il nostro EA mostri un segnale di acquisto quando l'indicatore (per esempio, ho preso il CCI) attraversa un certo livello (la linea rossa) dal basso verso l'alto, e un segnale di vendita quando esso, rispettivamente, scende. Come possiamo fare in modo che l'ordine si apra solo una volta durante la formazione della barra A? Supponiamo che l'indicatore incroci il livello (la linea rossa) verso il basso e verso l'alto diverse volte durante la formazione della barra A. Come ho già detto, dovremmo fare in modo che l'ordine venga aperto solo una volta.

Ciò di cui ho bisogno è che il segnale di vendita ricevuto sulla barra D (situazione 2 sul grafico) non chiuda l'ordine aperto sulla barra A , e non sia influenzato in alcun modo.

Cioè, gli ordini non sono controllati dall'Expert Advisor dopo la loro apertura.


Grazie in anticipo.

 

Per favore aiutatemi ad allegare un pezzo di codice Sequent Demarque all'EA https://www.mql5.com/ru/code/7372

non funziona così:

num=0:

for(i=bars; i>=0; i--)
{
se ((iClose(NULL,PERIOD_M5,i+1)<iClose(NULL,PERIOD_M5,i+4) && num!=0 )) {
num++;


se ((iClose(NULL,PERIOD_M5,i+1)<iClose(NULL,PERIOD_M5,i+4))
comprare.......

se (num==9)
chiudere........

 
Vinin:


1. Conta il numero di ordini del primo tipo

2. Conta il numero di ordini di tipo 2

3. Confrontare i risultati


Caro Vinin. Grazie mille!
 
Forrim:
Ecco la domanda. Supponiamo che il segnale di acquisto nell'EA sarà visualizzato quando l'indicatore (per esempio, ho preso CCI) attraversa un certo livello (linea rossa) dal basso verso l'alto e il segnale di vendita, rispettivamente, quando è dall'alto verso il basso. Come possiamo fare in modo che l'ordine si apra solo una volta durante la formazione della barra A? Supponiamo che l'indicatore incroci il livello (la linea rossa) verso il basso e verso l'alto diverse volte durante la formazione della barra A. Come ho già detto, dovremmo fare in modo che un ordine venga aperto solo una volta.

Questo richiede che ad un segnale di vendita da ricevere sulla barra D (situazione 2 sul grafico) l'ordine aperto sulla barra A non deve essere chiuso e non deve essere influenzato in alcun modo.

Cioè, gli ordini non sono controllati dall'EA dopo la loro apertura.


Molte grazie in anticipo.

In realtà, il CCI salta così selvaggiamente che è meglio controllarlo dopo che il bar è stato chiuso e ne è stato aperto uno nuovo.

Se vogliamo controllare se il tempo di apertura di una candela è diverso (se lo è, l'ordine si apre) o è lo stesso (=> nessun ordine si apre), allora ad ogni incrocio dovremmo memorizzare il tempo di apertura nella variabile globale.

 
Forrim:
Ecco la domanda. Supponiamo, per esempio, che il nostro EA mostri un segnale di acquisto quando l'indicatore (per esempio, ho preso il CCI) attraversa un certo livello (la linea rossa) dal basso verso l'alto, e un segnale di vendita quando esso, rispettivamente, scende. Come possiamo fare in modo che l'ordine si apra solo una volta durante la formazione della barra A? Supponiamo che l'indicatore incroci il livello (la linea rossa) verso il basso e verso l'alto diverse volte durante la formazione della barra A. Come ho già detto, dovremmo fare in modo che l'ordine venga aperto solo una volta.

Ciò di cui abbiamo bisogno è che il segnale di vendita ricevuto sulla barra D (situazione 2 sul grafico) non chiuda l'ordine aperto sulla barra A , e non sia influenzato in alcun modo.

Cioè, gli ordini non sono controllati dall'Expert Advisor dopo la loro apertura.


Grazie in anticipo.

Se una posizione di questo tipo è già aperta, non aprirne altre.
 
//--------------------------------------------------------------- 1 --
                                   // Численные значения для М15
extern double StopLoss   =20;      // SL для открываемого ордера
extern double TakeProfit =20;      // ТР для открываемого ордера
extern double Step_Sar=0.02;       // Шаг Sar
extern double Maximum_Sar=0.2;     // Максимум Sar
extern double Lot=0.01;            // Жестко заданное колич. лотов
bool Work=true;                    // Эксперт будет работать.
//--------------------------------------------------------------- 2 --
int start()
  { 
   int   
   Total,                           // Количество ордеров в окне 

   Ticket;                          // Номер ордера
   
   double
   Sar_1 ,                          // Значен. Sar текущее
   Sar_0 ,                          // Значение Sar предыдущей свечки      
   Price,                           // Цена ордера
   SL,                              // SL ордера 
   TP;                              // TP ордера
   
   bool
   Ans  =false,                     // Ответ сервера после закрытия
   Cls_B=false,                     // Критерий для закрытия  Buy
   Cls_S=false,                     // Критерий для закрытия  Sell
   Opn_B=false,                     // Критерий для открытия  Buy
   Opn_S=false;                     // Критерий для открытия  Sell
   
//--------------------------------------------------------------- 3 --   
   // Учёт ордеров   

   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symbol())continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }

   
     
       
        
    
         
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
         }
         }
   
//--------------------------------------------------------------- 6 --
   // Торговые критерии
   Sar_1=iSAR(NULL, 0, 0.02, 0.2, 1);           // Sar_1
   Sar_0=iSAR(NULL, 0, 0.02, 0.2, 0);           // Sar_0
 
   if (Sar_0 > Price && Sar_1 < Price)          // если Sar меняет положение
     {
      Opn_B=true;                               // Критерий откр. Buy             
     }  
   if (Sar_0 < Price && Sar_1 > Price)          // если Sar меняет положение
     {                                          
      Opn_S=true;                               // Критерий откр. Sell                                   
     }   
//--------------------------------------------------------------- 7 --
  
     {
      if (Opn_B==true)         
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=(20+Ask-Bid)*Bid;                 // Вычисление SL откр.
         TP=20*Bid;                           // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,0,SL,TP);//Открытие Buy                         
        }
        if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                                   
         return;                                // Выход из start()
        
        
      if (Opn_S==true)                          // критерий откр. Sell
      
        {                                       // критерий откр. Sell
         RefreshRates();                        // Обновление данных
         SL=(20+Ask-Bid)*Ask;                 // Вычисление SL откр.
         TP=20*Ask;                           // Вычисление TP откр.
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,0,SL,TP);//Открытие Sel
         
         return;                                // Выход из start()
        }
        
      if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                      
         return;                                // Выход из start()
        
     }
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error)                        // Ф-ия обработ ошибок
  {
   switch(Error)
     {                                          // Преодолимые ошибки            
      case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");
         Sleep(3000);                           // Простое решение
         return(1);                             // Выход из функции
      case 135:Alert("Цена изменилась. Пробуем ещё раз..");
         RefreshRates();                        // Обновим данные
         return(1);                             // Выход из функции
      case 136:Alert("Нет цен. Ждём новый тик..");
         while(RefreshRates()==false)           // До нового тика
            Sleep(1);                           // Задержка в цикле
         return(1);                             // Выход из функции
      case 137:Alert("Брокер занят. Пробуем ещё раз..");
         Sleep(3000);                           // Простое решение
         return(1);                             // Выход из функции
      case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
         Sleep(500);                            // Простое решение
         return(1);                             // Выход из функции
         // Критические ошибки
      case  2: Alert("Общая ошибка.");
         return(0);                             // Выход из функции
      case  5: Alert("Старая версия терминала.");
         Work=false;                            // Больше не работать
         return(0);                             // Выход из функции
      case 64: Alert("Счет заблокирован.");
         Work=false;                            // Больше не работать
         return(0);                             // Выход из функции
      case 133:Alert("Торговля запрещена.");
         return(0);                             // Выход из функции
      case 134:Alert("Недостаточно денег для совершения операции.");
         return(0);                             // Выход из функции
      default: Alert("Возникла ошибка ",Error); // Другие варианты   
         return(0);                             // Выход из функции
     }
  }
//-------------------------------------------------------------- 11 --

EA elementare, dovrebbe aprire una posizione quando l'indicatore Parabolic SAR cambia rispetto al grafico del prezzo, lavora su M15, SL e TP sono sempre costanti per la posizione aperta.

L'EA confronta le posizioni degli indicatori delle candele attuali e precedenti.

Non ci sono errori o bug durante la compilazione, nel test nelle schede "risultati" "grafico" "rapporto" è vuoto, nel log è questo: "immagine".

Sto codificando per il secondo giorno, non ho mai codificato prima, ho letto i miei libri mql e cercato su internet il mio problema. Sono ad un punto morto, per favore aiutatemi se potete.


 

T.H.C. prova questo




File:
0000001_1.mq4  3 kb
 
Techno:

T.H.C. Prova questo.




Grazie mille, non mi aspettavo una risposta così rapida e un tale cambiamento nel codice.

Si prega di consigliare su libri di programmazione diversi da mql di base

 
T.H.C.:

Grazie mille, non mi aspettavo una tale velocità e cambiamenti nel codice.

Per favore, consigliatemi altri libri sulla programmazione, oltre a mql di base.

Ho letto solo quello di base, hai bisogno di più pratica per avere una buona comprensione dell'argomento.
Motivazione: