Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 938

 
Seric29:

Eu quero criar uma matriz unidimensional onde 0 a 4 elementos irão armazenar o dobro, 5 a 9 irão armazenar o datetame, 10 a 14 irão armazenar o int. É possível organizá-lo em mql4? Se sim, você poderia me mostrar como, já vi um exemplo com estruturas em C++, mas perdi o link para o site?

Se você tiver células de matriz específicas alocadas para cada tipo, faça uma estrutura ao invés de uma matriz.

 
Koldun Zloy:

Se você tiver células de matriz específicas alocadas para cada tipo, então faça uma estrutura ao invés de uma matriz.

Infelizmente, ele não pode sequer formalizar a tarefa

por um lado parece que ele quer fugir da digitação rigorosa em C++ / MQL , aqui está um bom tópico de discussão, embora duvide que isso o ajudehttps://www.mql5.com/ru/forum/294094

No decorrer desta discussão (acho que já está ocorrendo há 3 meses?) acontece que@Seric29 precisa se afastar da descrição de assinaturas de funções e obter umafunção "fantasma" que pode ter um número arbitrário de parâmetros passados a ele

Em seguida, durante a discussão, conclui-se que as matrizes dinâmicas multidimensionais devem ser envolvidas em tudo isso, e essas matrizes devem ser passadas para a função como parâmetros

Isto é, esta é uma tarefa não-formalizada, cuja solução acaba constantemente em "gritos de campo", os desenvolvedores reduziram a funcionalidade de algo e me dão o código fonte dos operadores de loop, eu vou refazê-los, depois este último:

Seric29:
Como escrever uma carta aos desenvolvedores do mql4 como ver o código do compilador, há alguma forma de acrescentar mais recursos para que não seja tão estático?

... é só isso... a frase "golpe de mente" é o mínimo que você pode dizer ))))

 

É por isso que eu não dou nenhum detalhe.

Não há como fugir do aprendizado do básico.

 
Koldun Zloy:

Não há como fugir da aprendizagem do básico.

É interessante que um homem não aprende o básico, mas tenta mostrar que já sabe tudo, e todos vocês são metaquotas que o impedem de fazer seu trabalho)

 
Taras Slobodyanik:

é interessante que o homem não está aprendendo o básico, mas está tentando mostrar que ele já sabe tudo, e todos vocês são metaquotas que o impedem de fazer seu trabalho)

Saudações. Assisti ao vídeo do Expert Advisor "From MQL4 to MQL5 - How to Rewrite an EA for Metatrader 5".
Muito obrigado ao autor. Eu mesmo decidi experimentar. Eu mesmo decidi experimentar. A idéia é a seguinte:
1. Coloco dtriger = 1 nas entradas - A compra abre.
2. Eu configuro dtriger = -1 - Vender abre. 3.
3. eu configuro dtriger = 0 nos multiplugs - todos os abertos são fechados.
Li no FAQ que no MT5 não é possível ocupar posições opostas,
e eu os tenho.
Pergunta: Como posso prescrever corretamente o fechamento de uma posição aberta
A questão é: Como prescrever corretamente o fechamento de uma posição ativa na abertura de uma seta (reverso)?
Muito obrigado.

#Incluir <ComércioInfo.mqh>.
#Incluir <Comércio.mqh>
#Incluir <Comércio\SymbolInfo.mqh>
#Incluir <Comércio\OrderInfo.mqh>

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

input int triger = 0;
entrada dupla StartLot = 0,01;
volume lpos_duplo de entrada = 1,0;
input int Etapa = 10;
entrada no MagicNumber = 12345; // nuaber mágico
input int Slippage = 30; // slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Função de iniciação de especialista|
//+------------------------------------------------------------------+
int OnInit()
{
dStep = Passo ;
dtriger = triger ;

se (!o_símbolo.Nome(Símbolo()))
return(INIT_FAILED);

RefreshRates();

o_trade.SetExpertMagicNumber(MagicNumber) ;

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

if (o_símbolo.dígitos() == 3 || o_símbolo.dígitos() == 5 )
{
dStep = 10 ;
}

return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Função de desinicialização especializada|
//+------------------------------------------------------------------+
nulo OnDeinit(const int razão)
{
}
//+------------------------------------------------------------------+
//| função de carrapato de especialista|
//+------------------------------------------------------------------+
nulo OnTick()
{
data/horalpos_time = 0;
duplo lpos_price_open = 0,0;
ENUM_POSITION_TYPE lpos_type = -1;
intpos_count = 0;
soma_lucro duplo = 0;

para (int i = PosiçõesTotal() - 1; i>=0; i--)
{
if (o_position.SelectByIndex(i))
{
if (o_posição.Símbolo() == o_símbolo.Nome() && o_posição.Magic() == MagicNumber)
{
if (o_position.Time() > lpos_time)
{
lpos_time = o_position.Tempo(); //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() ;
}
}
}

// Conte o número de ordens pendentes
int stop_count=0;

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

se (!RefreshRates())
retornar ;

if(dtriger == 0 )
{
CloseAll();
retornar;
}

// + ----- Abrir primeiro pedido ++++++++++
se (pos_count == 0 && stop_count == 0 )
{
se ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_símbolo.Nome()); // S E L L 11111
}

se ( 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_símbolo.Nome()); // S E L 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() ;

}
//-----------------------------------------------------------
RefreshRates()
{
se (!o_símbolo.RefreshRates()))
retorno(falso) ;

se (o_símbolo.Ask() == 0 || o_símbolo.Bid() == 0)
retorno(falso);

retorno(true);
}
//--- ---------------------------------------------------------
bool IsFillingTypeAllowed (símbolo de corda, tipo int fill_type)
{
int filling = (int)SymbolInfoInteger(símbolo, SYMBOL_FILLING_MODE);

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

// --------------------------------------------------
Válido CloseAll()
{
para (índice int = PosiçõesTotal()-1; índice >=0; índice--)
{
if (o_position.SelectByIndex(index))
{
if (o_posição.Símbolo() == o_símbolo.Nome() && o_posição.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket())
}
}
}
}

//-----------------------------------------------------------
// Eliminar todas as ordens pendentes
//-------------------------------------
void DeleteStopOrders()
{
para (int i = OrderTotal() - 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())
}
}

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

 
procom:

Saudações....

Por favor, insira o código corretamente:


 
Artyom Trishkin:

Por favor, insira o código corretamente:


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());
   }
 } 
 
//+------------------------------------------------------------------+
Arquivos anexados:
Stend_t1.mq5  12 kb
 
Igor Makanu:

comece a ler pelo menos um livro sobre C++, suas perguntas são uma explosão, você escreve termos técnicos, à primeira vista parece que você está fazendo uma pergunta específica, mas na verdade você apenas opera em termos sem entender a essência .... o que a macro retornará? onde retornará? no corpo da macro uma função recarregável.... Não consigo nem mesmo começar a explicar como é sua pergunta.

Para entender o que é uma macro, escreva o termo corretamente, macroSETTING , talvez seja mais fácil para você entender o que é

Em mql4 as características e C++ são reduzidas, em outras palavras, é uma linguagem muito estática. Posso dizer que minha idéia falhou, escrevi uma simples sobrecarga sem aulas, acrescentei argumentos e dei 0, tentei chamá-la de macro, tive um erro de que existem 3 funções, então acontece que preciso descrever ainda qual chamar e como, e não estou dizendo que tipo de tropeços terei que lidar mais tarde. Provavelmente é melhor não fazer nada, então você não cometerá um erro.

 
Seric29:

mql4 tem características de corte e c++, em outras palavras, é uma linguagem muito estática.

O que foi cortado, exatamente?

Em outras palavras, você não precisa, especialmente nem mesmo o google conhece" linguagemmuito estática", C++ é uma linguagem estaticamente digitada e pensar sobre ela não tem sentido - apenas é.

Seric29:

Provavelmente é melhor não fazer nada, então você não cometerá um erro.

Vou ser breve RTFM ( lurkmore )

 

A questão é puramente de estética.

Como faço para que haja uma imagem própria aqui mesmo? MT4