Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 482

 

@STARIJ Grazie, mi sono preso del tempo per scrivereObjectSet! È stato scritto da tempo, non commentato, e il codice non interferisce! Hai scrittoStringSubstr(str,20,7), non pensavo che fosse tutto letterale! Dopo la cena, ho capito che era tutta una questione di spazi! Avrei dovuto contare ogni carattere e spazio! Grazie amico!!!!


 

Ciao, cari amici. Un'altra domanda da un principiante di μl4. Uso la funzione Fun_New_Bar() raccomandata nel tutorial per definire una nuova barra:


void Fun_New_Bar()                              // Ф-ия обнаружения нового бара   
  {                                             
   static datetime New_Time=0;                  // Время текущего бара  
   New_Bar=false;                               // Нового бара нет  
   if(New_Time!=Time[0])                        // Сравниваем время  
     {  
      New_Time=Time[0];                         // Теперь время такое  
      New_Bar=true;                             // Поймался новый бар  
     }  
  }
Tuttavia, per qualche motivo non funziona sempre. Ho inserito un controllo di stampa:
if(Hour()>=8 && Hour()<20) 
      {
      Fun_New_Bar();
      if(New_Bar==false) Print("Нового бара нет");
      if(New_Bar==true )      
       {     
       RefreshRates();
        ........... Fun_Open_Sell();          
        ........... Fun_Open_Buy();
       } 
      }

Quindi, apre una posizione su una nuova barra, poi stampa "No new bar" e apre una posizione sulla barra attuale. Non riesco a capire perché. Grazie.

 
novichok2018:

Ciao, cari amici. Un'altra domanda da un principiante di μl4. Uso la funzione Fun_New_Bar() raccomandata nel tutorial per definire una nuova barra:

Tuttavia, in qualche modo non funziona sempre. Ho messo un assegno di stampa:

Quindi, apre una posizione su una nuova barra, poi stampa "No new bar" e apre una posizione sulla barra attuale. Non riesco a capire perché. Grazie.

Come si fa a distinguere tra New bar e Current bar? Quanto spesso viene eseguita questa parte del codice - ogni tick o solo quando si forma una nuova barra?

 
STARIJ:

come si distingue tra New bar e Current bar? Quanto spesso viene eseguita questa parte del codice - ogni tick o solo quando si forma una nuova barra?

Nuovo bar - per funzione. La barra corrente - in cui una posizione è stata chiusa, ma il tempo della barra non è scaduto. Il codice deve essere eseguito al momento della formazione di unanuova barra. O meglio, non così. La parte di codice dove sono definite le condizioni di chiusura della posizione viene eseguita ogni tick, mentre quelle di apertura della posizione vengono eseguite in una nuova barra.

 
novichok2018:

Nuovo bar - per funzione. Current - dove la posizione è stata chiusa ma il tempo della barra non è scaduto. Il codice deve essere eseguito nel momento in cui si forma lanuova barra. O meglio, non lo è. La parte di codice dove sono definite le condizioni di chiusura della posizione viene eseguita ogni tick, mentre la condizione di apertura della posizione viene eseguita in una nuova barra.

Quindi, tutto è chiaro qui. Ma quando stai scrivendo e vedi che dovresti scrivere in modo più preciso, sposta il cursore indietro e correggi. Altrimenti è difficile leggerlo di qua e di là.

Il codice viene eseguito ad ogni tick. Cioè la domanda "C'è un nuovo bar? C'è un nuovo bar? C'è una nuova barra? e ogni volta viene stampato un messaggio che non c'è una nuova barra. E poi c'è un nuovo bar. L'ordine si apre? Prima viene inviato un comando al server. E poi arrivano le zecche e c'è una nuova barra? C'è un nuovo bar e ogni volta che non c'è un nuovo bar, il server finalmente apre un ordine e tu guardi l'ora e ti chiedi che ora è. Potete usare Print(TimeCurrent()) prima dell'apertura di un ordine, 4 righe sotto la prima. O meglio ancora, usate Alert - direttamente sullo schermo. Si può vedere a colpo d'occhio.

Un'altra cosa: invece di if(New_Bar==false) if(New_Bar==true), potete usare if(!New_Bar) if(New_Bar) altrimenti otterrete olio di burro

 
STARIJ:

In breve, qui è tutto chiaro. Ma quando scrivete e vedete che dovete scrivere in modo più preciso, riportate il cursore indietro e correggete. È difficile leggerlo di qua e di là.

Il codice viene eseguito ad ogni tick. Cioè la domanda "C'è un nuovo bar? C'è un nuovo bar? C'è una nuova barra? e ogni volta viene stampato un messaggio che non c'è una nuova barra. E poi c'è un nuovo bar. L'ordine si apre? Prima viene inviato un comando al server. E poi arrivano le zecche e c'è una nuova barra? C'è un nuovo bar e ogni volta che non c'è un nuovo bar, il server finalmente apre un ordine e tu guardi l'ora e ti chiedi che ora è. Potete usare Print(TimeCurrent()) prima dell'apertura di un ordine, 4 righe sotto la prima. O meglio ancora, usate Alert - direttamente sullo schermo. Si può vedere a colpo d'occhio.

E un'altra cosa: invece di if(New_Bar==false) if(New_Bar==true) potete usare if(!New_Bar) if(New_Bar) altrimenti otterrete olio

Ok, tutto è chiaro con il messaggio sull'assenza di una nuova barra. Il tempo di apertura dell'ordine visualizzato nel giornale dalla piattaforma è abbastanza sufficiente per me anche senza una stampa supplementare. Tuttavia, ancora non capisco perché un ordine viene aperto su una nuova barra una volta e su quella corrente la seconda volta, anche se secondo il codice, una nuova barra dovrebbe apparire prima di cercare le condizioni per aprire la posizione.

 
novichok2018:

OK, tutto è chiaro con il messaggio sulla mancanza di un nuovo bar. L'ora di apertura dell'ordine stampata nel registro dalla piattaforma è sufficiente per me anche senza la stampa supplementare. Tuttavia, ancora non capisco perché l'ordine si apre su una nuova barra una volta e su quella attuale la seconda volta, anche se secondo il codice, una nuova barra dovrebbe apparire prima di cercare le condizioni per aprire la posizione.

In primo luogo, viene inviato un comando al server. Nel frattempo, le zecche arrivano e C'è una nuova barra? C'è una nuova barra e ogni volta non c'è una nuova barra, il server finalmente apre un ordine e tu guardi l'ora e ti chiedi. Potete usare Print(TimeCurrent( )) prima dell'apertura di un ordine, 4 righe sotto la prima. O meglio ancora, usa Alert - direttamente sullo schermo. Si può vedere a colpo d'occhio... il comando per aprire l'ordine è stato inviato prima, sulla nuova barra

 

Potete dirmi come rendere possibile un colore di ombreggiatura tra le 2 linee dell'indicatore?

Come in ishimoku

 
Roman Sharanov:

Potete dirmi come rendere possibile avere un colore di ombreggiatura tra le 2 linee dell'indicatore? Come nell'ishimoku

Dateun'occhiata a come si fa... E il terminale ha probabilmente...

 

Ciao, ho iniziato a studiare MQL4 utilizzando i video tutorial 2013, ho riscritto il codice esattamente dal video, aggiungendo alcune piccole modifiche da un altro, come ho bisogno di loro. Ho provato a cercare la soluzione a questi errori, ma dal momento che la build del terminale è cambiata e sono avvenuti alcuni cambiamenti nella codifica. Sarò grato se qualcuno può aiutarmi a modificare il codice o almeno darmi qualche consiglio utile, grazie in anticipo.

//+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link      ""
#property version   "1.00"
#property strict

extern double Lots         = 0.1;
extern int    TakeProfit   = 50;
extern int    Step         = 50;
extern double Multiplier   = 2;
extern int    Slippage     = 5;
extern int    Magic        = 123;

extern int    MA_1_Period  = 21;
extern int    MA_1_Shift   = 0;

extern int    MA_2_Period  = 3;
extern int    MA_2_Shift   = 0;


int ticket;
double price, TP, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit *= 10;
       Step       *= 10;
       Slippage   *= 10;  
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
{
   if (CountTrades() == 0)
   {
      double ima_1 = iMA(Symbol(), PERIOD_CURRENT, MA_1_Period, MA_1_Shift, MODE_SMA, PRICE_CLOSE, 1);
      double ima_2 = iMA(Symbol(), PERIOD_CURRENT, MA_2_Period, MA_2_Shift, MODE_SMA, PRICE_CLOSE, 1);
      
      if (ima_1 > ima_2)
      {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      else if(ima_1 < ima_2)
      {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      
   }
   else
   {
      int order_type = FindLastType();
      if (order_type == OP_BUY)
      {
         price = FindLastOrderPrice(OP_BUY);
         if(Ask <= price - Step * Point)
         {
            Lastlot = FindLastLots (OP_BUY);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
            if (ticket > 0)
               ModifiOrders(OP_BUY);
         }
      }
      else if (order_type == OP_SELL)
      {
          price = FindLastOrderPrice(OP_SELL);
         if(Bid <= price + Step * Point)
         {
            Lastlot = FindLastLots (OP_SELL);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Bid, Slippage, 0, 0, "", Magic, 0, Red);
            if (ticket > 0)
               ModifiOrders(OP_SELL);
         }        
      }
   }
   
   return(0);
}
//+------------------------------------------------------------------+
void ModifiOrders(int otype)
{
   double avgprice = 0,
          order_lots= 0;
   
   price = 0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelecti(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots();
         }
      }
   }
   avgprice = NormalizeDouble(price / order_lots, Digits);
   
   if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
   if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);
   
   for (i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0)    
      } 
   }
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
   double oldlots;
   int oldticket;
   
   ticket = 0;
   for(int i = OrdersTotal ()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() ++ otype)
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldlots = OrderLots();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
   double oldopenprice;
   int    oldticket;
   
   ticket = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldopenprice = OrderOpenPrice();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for (int i= OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber () == Magic)
              return(OrderType());
      }
   }
   return(-1);   
}
//+------------------------------------------------------------------+
int CountTrades()
{
   int count = 0;
   for (int i=OrdersTotal()-1 i>=0; i--)
   {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               count++;
        }
   }
   
   return(count);

//-------------------------------------------------------------------+

Errori

Motivazione: