Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 223

 
Tarde. Por favor, ajude um comerciante principiante a encontrar um consultor adequado para a negociação automatizada, que seja capaz de abrir ordens bloqueadas em pares de divisas com a possibilidade de obter lucros de forma arbitrária. Obrigado.
 
abcxyzabcxyz:
Tarde. Por favor, ajude um comerciante principiante a encontrar um consultor adequado para a negociação automatizada, que seja capaz de abrir ordens bloqueadas em pares de divisas com a possibilidade de obter lucros de forma arbitrária. Obrigado.
Se precisar realmente de bloqueio, está no sítio certo. Não há bloqueio no MetaTrader 5 uma vez que o MetaTrader 5 é uma plataforma de rede.
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle:
Alternativamente: método de declaração do tipo em todos eles, no qual o identificador do tipo de retorno.

Heh, se pudesse editar o código fonte... Não é preciso simplificar tanto as coisas. E ainda - há um nome de classe em mql5?

 
YAndrey:

Heh, se pudesse editar o código fonte... Não é preciso simplificar tanto as coisas. Ainda assim - há alguma forma de o mql5 saber o nome de uma classe????

Olhar na direcção dos modelos. Este código devolverá o nome da classe ou de um tipo primitivo.

#Incluir<Comércio\Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
nuloOnStart()
{
//---
Comércio de CTrade;
duplo d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value),", value=", d_value);
Print("i_value: type=",GetTypeName(i_value),", value=", i_value);
Print("trade: type=",GetTypeName(trade);
//---
}
//+------------------------------------------------------------------+
//| Tipo de retorno em forma de fio|
//+------------------------------------------------------------------+
modelo<nome datilografar T>
string GetTypeName(const T&t)
{
//---- tipo de retorno como cordel
return(typename(T))
//---
}

 
C-4:

Olhe para padrões. Este código devolverá o nome de uma classe ou tipo primitivo.

#Incluir<Comércio\Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
nuloOnStart()
{
//---
Comércio de CTrade;
duplo d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value),", value=", d_value);
Print("i_value: type=",GetTypeName(i_value),", value=", i_value);
Print("trade: type=",GetTypeName(trade);
//---
}
//+------------------------------------------------------------------+
//| Tipo de retorno em forma de fio|
//+------------------------------------------------------------------+
modelo<nome datilografar T>
string GetTypeName(const T&t)
{
//---- tipo de retorno como cordel
return(typename(T))
//---
}

Eu tenho algo! Mas não funciona com o novo - no código há um exemplo do que preciso - pode ser que alguém possa sugerir como?

class a{
public:
virtual void Print(){Print("Print class a");}
};

class b:public a{
public:
virtual void Print(){Print("Print class b");}
};

class c:public a{
public:
virtual void Print(){Print("Print class c");}
void Print2(){Print("!Print2! class c");}
};


void add(a *&arr[], bool var)
{
   ArrayResize(arr, ArraySize(arr)+1);
   if (var)
      arr[ArraySize(arr)-1] = new b;
   else
      arr[ArraySize(arr)-1] = new c;
   
}

void OnStart()
  {
//--- 
   
   
   a *arr[];

   add(arr, true); // На самом деле здесь я НЕ знаю, какой класс добавит функция add
   add(arr, false); // Это потомок класса а или сам класс а, исходный код которого я править не могу.
   for (int i = 0; i < ArraySize(arr); i++)
   {
      // Вот тут то мне и надо узнать, что за класс там
      // шаблон вернет *а, как и объявлено. Но мне надо проверить - можно ли вызвать функцию, которая есть только в с
      if (i == 1) // Вот тут должна быть проверка на имя класса
      {
         c *tmp = arr[i];
         tmp.Print2();
      }
    }  
   
   
   
   
   
//--- 
  }
 
YAndrey:

Eu tenho algo! Mas não funciona com o novo - há um exemplo no código do que eu preciso - alguém pode sugerir alguma forma?

Este é um problema do método modelo. Infelizmente, o método do modelo devolve o nome da classe que faz referência à instância. O tipo de instância em si é ainda desconhecido.
 

Alguém me pode explicar porque é que este código não funciona no testador, enquanto em tempo real funciona!!? Especificamente interessado em porque no testador, após HistorySelect(0, TimeCurrent()) o HistoryOrderGetInteger...

#include <Trade\Trade.mqh>

CTrade trade;

int OnInit()
{
   trade.LogLevel(LOG_LEVEL_NO);
   return INIT_SUCCEEDED;
}
void OnTick()
{
   if(!DetectNewBar())return;
   trade.Sell(0.1);
   HistorySelect(0, TimeCurrent());
   for(; dealsCount < HistoryDealsTotal(); dealsCount++)
   {
      ulong ticket = HistoryDealGetTicket(dealsCount);
      RecalcDeal(ticket);
   }
}

bool DetectNewBar(void)
{
   MqlRates bars[1];
   CopyRates(Symbol(), PERIOD_M1, 0, 1, bars);
   if(bars[0].time != timeLastBar)
   {
      timeLastBar = bars[0].time;
      //printf(expertName + " new bar detected: " + TimeToString(bars[0].time));
      return true;
   }
   return false;
}

void RecalcDeal(ulong ticketDeal)
{
   //History is selected in OnTick()!
   ulong ticketOrder = HistoryDealGetInteger(ticketDeal, DEAL_ORDER);
   //if(!HistoryOrderSelect(ticketOrder))
   //   printf("order not select.");
   ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticketOrder, ORDER_TYPE);
   datetime time = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP); 
   ulong time_msc = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP_MSC); 
   printf("Order: " + (string)ticketOrder + " Type: " + EnumToString(type) + " Time: " + (string)time +
          " Time msc: " + (string)time_msc + " Total Orders: " + HistoryOrdersTotal());
}

int dealsCount;

datetime timeLastBar;

Imagem de ecrã no testador de estratégia:

Imagem de ecrã em tempo real na demonstração:

p.s. O que é interessante, a primeira encomenda no testador é processada correctamente, as outras não são. Também, se comentarmos HistroryOrderSelect(ticketOrder), recebemos uma mensagem no Strategy Tester de que a ordem não foi seleccionada e no Strategy Tester, tudo começa a funcionar, excepto a primeira ordem.

 

E eu tenho alguns problemas com HistorySelect(). Abro uma posição com o guião enviando uma ordem de mercado, e se um negócio foi aberto, olho imediatamente para o número de negócios na história desde que o guião foi lançado, e verifico 10 vezes com um intervalo de um segundo. Obviamente, deveria haver uma profissão. Aqui está o guião:

void OnStart()
{
        // время запуска скрипта
        datetime dtStartTime = TimeCurrent();
        
        // структуры запроса
        MqlTradeRequest oRequest = {0};
        MqlTradeResult oResult = {0};
        
        // формируем запрос
        oRequest.action = TRADE_ACTION_DEAL;
        oRequest.magic  = 15;
        oRequest.symbol = _Symbol;
        oRequest.volume = 0.1;
        oRequest.type   = ORDER_TYPE_BUY;
        oRequest.type_filling = ORDER_FILLING_FOK;
        oRequest.price  = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
        oRequest.deviation = 1000;
        
        // шлём ордер
        bool bResult = OrderSend(oRequest, oResult);
        
        // если позиция успешно открыта
        if(bResult == true && oResult.retcode == 10009) // если позиция открыта
        {
                for(int i = 0; i < 10; i++)
                {
                        // запрашиваем историю за время работы скрипта
                        HistorySelect(dtStartTime, TimeCurrent());
                
                        // количество сделок за время работы скрипта (должна быть одна)
                        Print("Шаг: ", i, " Совершено сделок: ", HistoryDealsTotal());
                        
                        Sleep(1000);
                }
        }
}

E aqui está o resultado em Alfa-Forex:

Uma troca é realmente feita, mas não está na história, mesmo depois de 10 segundos. O que é isso? Um bug MT? Falha Alfa? Algum tipo de chip que eu não conheço? O guião da Alpari funciona normalmente, apenas ocasionalmente é detectado zero no primeiro (zero) passo (bem, é compreensível - a história ainda não teve tempo de ser actualizada), todos os outros passos são um só. Mas após dez segundos, porque é que não há acordo na história?

 
Algo:

E eu tenho alguns problemas com HistorySelect(). Abro uma posição com o guião enviando uma ordem de mercado, e se um negócio foi aberto, olho imediatamente para o número de negócios na história desde que o guião foi lançado, e verifico 10 vezes com um intervalo de um segundo. Obviamente, deveria haver uma profissão. Aqui está o guião:

E aqui está o resultado do corretor Alfa:

Uma troca é realmente feita, mas não está na história, mesmo depois de 10 segundos. O que é isto? Um bug MT? Falha Alfa? Algum tipo de chip que eu não conheço? O guião da Alpari funciona normalmente, apenas ocasionalmente é detectado zero no primeiro (zero) passo (bem, é compreensível - a história ainda não teve tempo de ser actualizada), todos os outros passos são um só. Mas porque é que não há acordo na história em dez segundos?

O que me incomoda é a seguinte linha

data/hora dtStartTime = TimeCurrent();

Tem a certeza de que dtStartTime e TimeCurrent() não são o mesmo número de momento para? Talvez o arredondamento para um segundo coloque a transacção concluída fora do dtStartTime.

 
C-4:

A linha

data/hora dtStartTime = TimeCurrent();

Tem a certeza de que dtStartTime e TimeCurrent() não são o mesmo número de tempo para? Talvez o arredondamento para um segundo coloque a transacção concluída fora do dtStartTime.

E mesmo que seja um, não deveria a MT produzir a história para esse segundo? Ou seja, não produz a história dentro dos limites especificados, INCLUINDO os próprios limites?

Mas de qualquer modo, tentei escrever tanto dtStartTime = TimeCurrent() - 1, como dtStartTime = TimeCurrent() - 10. Não funciona.

Razão: