Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 128

 
Anatoliy Ryzhakov:

L'ordine di vendita si chiude al prezzo Ask

Sono un po' confuso! Punta il dito dove si trova il bug nel codice!!!(il log dice ORDER CLOSE ERROR 4108) Grazie in anticipo!

 

Buon pomeriggio intenditori! Hai esaurito il giorno più difficile dell'anno? Possiamo passare agli affari? ;=).

Ho disegnato un EA, tutto è buono, ma come ho capito MQLQLQLQL5 funziona in ambiente MT4. Voglio che funzioni con un software che lavora direttamente con lo scambio. Ci sono altri compilatori MQL? Se no, che linguaggio dovrei usare per riscrivere MQL?

 
STARIJ:

Hai una pausa e devi continuare.

Non ho una pausa. Per quale motivo l'EA potrebbe non "vedere" i suoi ordini? Ho diversi orari di server e computer, forse per questo?

 
Anatoliy Ryzhakov: Non ho una pausa. Qual è la ragione per cui l'EA non può "vedere" i suoi ordini? L'orario del mio server e quello del mio computer sono diversi.

Il tempo di ognuno è diverso. Iniziare senza correre da lontano. 1. Controlla cosa ti dà la funzione OrdersTotal. Il suo valore dipende dalle impostazioni della cronologia: Oggi, ultimi 3 giorni, ultima settimana, ... Regolalo come preferisci. 2. Poi crea un ciclo ed emetti tutti gli ordini con Alert. Questo si chiama debugging - è una parte molto importante del lavoro di un programmatore. Più importante che scrivere codice.

 
Si prega di consigliare come risolvere l'errore di quantità di lotti non validi per la funzione FreeMarginCheck in EA, quando accidentalmente si imposta un valore di volume (lotto) negativo. Per avere un messaggio sul lotto sbagliato, senza messaggio di errore, nel tester .

 
STARIJ:

Il tempo di ognuno è diverso. Iniziare senza correre da lontano. 1. Controlla cosa ti dà la funzione OrdersTotal. Il suo valore dipende dalle impostazioni della cronologia: oggi, ultimi 3 giorni, ultima settimana, ... Regolatelo come volete. 2. Poi create un ciclo e fate uscire tutti gli ordini usando Alert. Questo si chiama debugging - è una parte molto importante del lavoro di un programmatore. Più importante che scrivere il codice.

Grazie!

 

Potete dirmi come scrivere nel codice dell'Expert Advisor per aprire 3 trade contemporaneamente con la possibilità di impostare lo SL?

Ecco la mia condizione

if(MA_1>MA_2)
ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

Mi è stato consigliato di usare la funzione (OrdersTotal()), ma non si adatta al mio caso. Ce l'ho così

void OnTick()
  {
//---
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
   if(OrdersTotal()<=3)
     {
      if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Compila bene, senza errori, ma non è adatto al mio caso.

Ho trovato il seguente codice

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  // для чего эта переменная
   int ticket=0;
   if(buy) 
     {
      while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates(); // если убрать эту функцию коду хуже не становится
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно
         if(ticket!=-1) // эта строчка тоже не понятна
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i=0;
   if(sell) // прошлая запись была для покупак эта для продаж 
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }  
//+------------------------------------------------------------------+

Forse può essere usato, ma non capisco il significato delle stringhe. Questo codice può essere usato quando viene riscritto per adattarsi alla mia condizione?

 
Seric29:

Potete dirmi come scrivere nel codice dell'Expert Advisor per aprire 3 trade contemporaneamente con la possibilità di impostare lo SL?

Ecco la mia condizione

Mi è stato consigliato di usare la funzione (OrdersTotal()), ma non si adatta al mio caso. Ce l'ho così

Compila bene, senza errori, ma non è adatto al mio caso.

Ho trovato il seguente codice

Forse può essere usato, ma non capisco il significato delle stringhe. Posso usare questo codice se lo riscrivo per adattarlo alla mia condizione?

Prova in questo modo

pos=0; //contatore di ordine

for(int i=OrdersTotal()-1;i>=0;i--) //leggere gli ordini di mercato

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continua;//seleziona dagli ordini di mercato

{

if (OrderSymbol()!=Symbol()&&OrderMagicNumber()!=Magic) continue;//seleziona solo gli ordini EA (se c'è Magic e si negozia su qualsiasi coppia di valute)

pos++; //se abbiamo selezionato, allora aumenta pos di uno

}

}

 if(MA_1>MA_2&&pos<3)
 OrderSend(_Symbol(),OP_BUY,Lots,Ask,0,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,clrGreen);
 if(MA_1<MA_2&&pos<3)
 OrderSend(_Symbol(),OP_SELL,Lots,Bid,0,Bid+SL*Point,Bid-TP*Point,NULL,Magic,0,clrRed);

 
Un forum piuttosto interessante. un sacco di cose illuminanti)!
 
Seric29:

Potete dirmi come scrivere nel codice dell'EA per aprire 3 trade contemporaneamente con la possibilità di impostare lo SL?

if(MA_1>MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-(i==0?SL_1:i==1?SL_2:SL_3)*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
     for(int i=0; i<3; i++)
          tiket = OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+(i==0?SL_1:i==1?SL_2:SL_3)*Point,Ask-TP*Point,NULL,0,0,clrRed);
Motivazione: