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

 
Seric29:

Voglio creare un array unidimensionale in cui da 0 a 4 elementi memorizzeranno double, da 5 a 9 memorizzeranno datetame, da 10 a 14 memorizzeranno int. È possibile organizzarlo in mql4? Se sì, potresti mostrarmi come, ho visto un esempio con strutture in C++, ma ho perso il link al sito?

Se avete celle di array specifiche allocate per ogni tipo, fate una struttura invece di un array.

 
Koldun Zloy:

Se avete celle di array specifiche allocate per ogni tipo, allora fate una struttura invece di un array.

Sfortunatamente, non può nemmeno formalizzare il compito

da un lato sembra che voglia allontanarsi dalla stretta digitazione in C++ / MQL , qui c'è un buon thread di discussione, anche se dubito che lo aiuteràhttps://www.mql5.com/ru/forum/294094

Nel corso di questa discussione (credo che vada avanti già da 3 mesi?) si scopre che@Seric29 ha bisogno di allontanarsi dalla descrizione delle firme delle funzioni e ottenere unafunzione "fantasma" che accetta un numero arbitrario di parametri

Poi si scopre durante la discussione che gli array dinamici multidimensionali dovrebbero essere coinvolti in tutto questo, e questi array dovrebbero essere passati nella funzione come parametri

Cioè questo è un compito non formalizzato, la cui soluzione finisce costantemente in "grida dal campo", gli sviluppatori hanno ridotto la funzionalità di qualcosa e mi danno il codice sorgente degli operatori di loop, li rifarò, poi quest'ultimo:

Seric29:
Come scrivere una lettera agli sviluppatori di mql4 come vedere il codice del compilatore, c'è un modo per aggiungervi altre caratteristiche in modo che non sia così statico?

... questo è tutto... la frase "mind blowing" è il minimo che si possa dire ))))

 

Ecco perché non do alcun dettaglio.

Non c'è modo di evitare di imparare le basi.

 
Koldun Zloy:

Non c'è modo di evitare di imparare le basi.

È interessante che un uomo non impari le basi, ma cerchi di mostrare che sa già tutto, e voi siete tutti meta-citazioni che gli impediscono di fare il suo lavoro)

 
Taras Slobodyanik:

è interessante che un uomo non impari le basi, ma cerchi di mostrare che sa già tutto, e voi siete tutti meta-citazioni che gli impediscono di fare il suo lavoro)

Saluti. Ho guardato il video Expert Advisor "Da MQL4 a MQL5 - Come riscrivere un Expert Advisor per Metatrader 5".
Molte grazie all'autore. Ho deciso di provare io stesso. Ho deciso di provare io stesso. L'idea è la seguente:
1. Ho impostato dtriger = 1 negli input - Buy si apre.
2. Ho impostato dtriger = -1 - Vendere si apre. 3.
3. Ho impostato dtriger = 0 nei multiplugs - tutti quelli aperti sono chiusi.
Ho letto nelle FAQ che in MT5 non è possibile tenere posizioni opposte,
e io li ho.
Domanda: Come posso prescrivere correttamente la chiusura di una posizione aperta
La domanda è: come prescrivere correttamente la chiusura di una posizione attiva all'apertura di una freccia (reverse)?
Grazie mille.

#include <Trade\PositionInfo.mqh>.
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo o_position;
CTrade o_trade;
CSymbolInfo o_symbol;
COrderInfo o_order;

input int triger = 0;
input double StartLot = 0.01;
input double lpos_volume = 1.0;
input int Step = 10;
input int MagicNumber = 12345; // Magic nuaber
input int Slippage = 30; // slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'esperto|
//+------------------------------------------------------------------+
int OnInit()
{
dStep = Passo ;
dtriger = triger ;

if (!o_symbol.Name(Symbol()))
return(INIT_FAILED);

RefreshRates();

o_trade.SetExpertMagicNumber(MagicNumber) ;

se (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK);
}
else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC);
}
else
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
}
o_trade.SetDeviationInPoints(Slippage);

if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dStep = 10 ;
}

return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione degli esperti|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| funzione tick esperto|
//+------------------------------------------------------------------+
void OnTick()
{
datetimelpos_time = 0;
doppio lpos_price_open = 0,0;
ENUM_POSITION_TYPE lpos_type = -1;
intpos_count = 0;
doppio sum_profitto = 0;

for (int i = PositionsTotal() - 1; i>=0; i--)
{
se (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
se (o_position.Time() > lpos_time)
{
lpos_time = o_position.Time(); //OrderOpenTime();
lpos_price_open = o_position.PriceOpen(); //OrderOpenPrice();
lpos_type = o_position.PositionType() ; //OrderTipe();
}

pos_count++;
sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
}
}
}

// Conta il numero di ordini pendenti
int stop_count=0;

for (int i=OrdersTotal()-1; i >=0; i--)
{
se (o_order.SelectByIndex(i))
{
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}

se (!RefreshRates())
ritorno ;

se(dtriger == 0 )
{
CloseAll();
ritorno;
}

// + ----- Aprire il primo ordine ++++++++++
if (pos_count == 0 && stop_count == 0 )
{
if ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L 11111
}

if ( dtriger == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y 11111
}
}


// + ----- Reverse ++++++++++++++++++++++++++++

se (pos_count>0)
{
if(lpos_type == POSITION_TYPE_BUY )
{
se ( dtriger == -1 )
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L +++++
}
}

se (lpos_type==POSITION_TYPE_SELL )
{
se ( dtriger == 1 )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y +++++
}
}
}


if(pos_count>0 && stop_count>0)
DeleteStopOrders() ;

}
//-----------------------------------------------------------
bool RefreshRates()
{
se (!o_symbol.RefreshRates())
return(false) ;

if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
return(false);

return(true);
}
//--- ---------------------------------------------------------
bool IsFillingTypeAllowed (string symbol, int fill_type)
{
int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);

return((filling && fill_type) == fill_type) ;
}

// --------------------------------------------------
void ChiudereTutti()
{
per (int index = PositionsTotal()-1; index >=0; index--)
{
se (o_position.SelectByIndex(index))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket())
}
}
}
}

//-----------------------------------------------------------
// Cancellare tutti gli ordini pendenti
//-------------------------------------
void CancellazioneStopOrdini()
{
for (int i = OrdersTotal() - 1; i >= 0; i-- )
{
se (o_order.SelectByIndex(i))
if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket())
}
}

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

 
procom:

Saluti....

Si prega di inserire il codice correttamente:


 
Artyom Trishkin:

Si prega di inserire il codice correttamente:


ok
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int          triger            = 0;
input double    StartLot             = 0.01;
input double    lpos_volume       = 1.0;
input int          Step         = 10;
input int          MagicNumber    = 12345;      //      Magic   nuaber
input int          Slippage          = 30;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name(Symbol()))
     return(INIT_FAILED);
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_FOK);
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_IOC);
   }
   else 
   {
      o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
   {
      dStep = 10 ;
   }
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      datetime              lpos_time          =        0;
      double                lpos_price_open    =        0.0;
      ENUM_POSITION_TYPE   lpos_type           =        -1;
      int                      pos_count               =        0;
      double                sum_profit         = 0;
 
   for (int i = PositionsTotal() - 1; i>=0; i--)
   {
      if (o_position.SelectByIndex(i))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();            //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
  int stop_count=0;

   for (int i=OrdersTotal()-1; i >=0; i--) 
   {
      if (o_order.SelectByIndex(i)) 
      {
         if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if(dtriger == 0 )
   {
      CloseAll();
      return;               
   } 
   
  // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0  && stop_count == 0    )
   {
      if ( dtriger == -1 &&  lpos_type != POSITION_TYPE_SELL)
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());  //   S E L L   11111
      }
      
      if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if(pos_count>0 && stop_count>0) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return(false) ;
     
    if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
      return(false);
      
    return(true);
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed (string symbol, int fill_type)
{ 
   int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); 
 
   return((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for (int index = PositionsTotal()-1; index >=0; index--)
   {
      if (o_position.SelectByIndex(index))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
    for (int i = OrdersTotal() - 1; i >= 0; i-- ) 
   {
      if (o_order.SelectByIndex(i))
         if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
File:
Stend_t1.mq5  12 kb
 
Igor Makanu:

inizia a leggere almeno un libro sul C++, le tue domande sono uno sballo, scrivi termini tecnici, a prima vista sembra che tu stia facendo una domanda specifica, ma in realtà operi solo in termini senza capirne l'essenza .... cosa restituirà la macro? dove restituirà? nel corpo della macro una funzione ricaricabile.... Non posso nemmeno iniziare a spiegare com'è la tua domanda.

Per capire cos'è una macro, scrivete il termine correttamente, macroSETTING , forse vi sarà più facile capire cos'è

In mql4 le caratteristiche e C++ sono ridotte, in altre parole, è un linguaggio troppo statico. Posso dire che la mia idea è fallita, ho scritto un semplice overload senza classi, ho aggiunto argomenti e dato loro 0, ho provato a chiamarlo in una macro, ho ottenuto un errore che ci sono 3 funzioni, quindi risulta che ho bisogno di descrivere ancora quale chiamare e come, e non sto dicendo che tipo di inciampi dovrò affrontare più tardi. Probabilmente è meglio non fare nulla, così non si commette un errore.

 
Seric29:

mql4 ha caratteristiche tagliate e C++, in altre parole un linguaggio troppo statico.

Cosa è stato tagliato, esattamente?

In altre parole, non è necessario, soprattutto nemmeno google sa" linguaggiotroppo statico", C++ è un linguaggio tipizzato staticamente e pensarci non ha senso - è proprio così.

Seric29:

Probabilmente è meglio non fare nulla, così non si commette un errore.

Sarò breve RTFM ( lurkmore )

 

La questione è puramente estetica.

Come faccio a fare in modo che ci sia un'immagine propria qui? MT4