Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 223

 
Pomeriggio. Per favore, aiutate un trader principiante a trovare un consulente adatto per il trading automatico, che sia in grado di aprire ordini bloccati in coppie di valute con la possibilità di impostare arbitrariamente il take profit. Grazie.
 
abcxyzabcxyz:
Pomeriggio. Per favore, aiutate un trader principiante a trovare un consulente adatto per il trading automatico, che sia in grado di aprire ordini bloccati in coppie di valute con la possibilità di impostare arbitrariamente il take profit. Grazie.
Se avete davvero bisogno di un bloccaggio siete nel posto giusto. Non c'è alcun blocco su MetaTrader 5 in quanto MetaTrader 5 è una piattaforma di netting.
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle:
In alternativa: dichiarare il metodo Type in tutti loro, in cui restituire l'identificatore del tipo.

Heh, se si potesse modificare il codice sorgente... Non è necessario semplificare così tanto le cose. E ancora - c'è un nome di classe in mql5?

 
YAndrey:

Heh, se si potesse modificare il codice sorgente... Non è necessario semplificare così tanto le cose. Ancora - c'è un modo per mql5 di conoscere il nome di una classe?

Guarda nella direzione dei modelli. Questo codice restituirà il nome della classe o un tipo primitivo.

#include<Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
Commercio CTrade;
doppio d_valore=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);
//---
}
//+------------------------------------------------------------------+
//| Restituisce il tipo in forma di stringa|
//+------------------------------------------------------------------+
template<typename T>
stringa GetTypeName(const T&t)
{
//---restituire il tipo come stringa
return(typename(T))
//---
}

 
C-4:

Guarda verso i modelli. Questo codice restituirà il nome di una classe o di un tipo primitivo.

#include<Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
Commercio CTrade;
doppio d_valore=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);
//---
}
//+------------------------------------------------------------------+
//| Restituisce il tipo in forma di stringa|
//+------------------------------------------------------------------+
template<typename T>
stringa GetTypeName(const T&t)
{
//---restituire il tipo come stringa
return(typename(T))
//---
}

Ho qualcosa! Ma non funziona con il nuovo - nel codice c'è un esempio di ciò di cui ho bisogno - forse qualcuno può suggerire come?

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:

Ho qualcosa! Ma non funziona con il nuovo - c'è un esempio nel codice di ciò di cui ho bisogno - qualcuno può suggerire qualche modo?

Questo è un problema di metodo di template. Sfortunatamente, il metodo template restituisce il nome della classe che fa riferimento all'istanza. Il tipo di istanza stessa è ancora sconosciuto.
 

Qualcuno può spiegarmi perché questo codice non funziona nel tester, mentre in tempo reale funziona!!!? In particolare mi interessa sapere perché nel tester, dopo HistorySelect(0, TimeCurrent()) la 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;

Schermata nel tester di strategia:

Schermata in tempo reale nella demo:

p.s. La cosa interessante è che il primo ordine nel tester viene elaborato correttamente ma gli altri no. Inoltre, se commentiamo HistroryOrderSelect(ticketOrder), otteniamo un messaggio nello Strategy Tester che l'ordine non è stato selezionato e nello Strategy Tester, tutto inizia a funzionare, tranne il primo ordine.

 

E ho qualche problema con HistorySelect(). Apro una posizione con lo script inviando un ordine a mercato, e se si è aperta un'operazione, controllo immediatamente il numero di operazioni nella storia dal lancio dello script, e lo controllo 10 volte ad un intervallo di un secondo. Ovviamente, ci dovrebbe essere un solo scambio, ecco lo script:

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);
                }
        }
}

Ed ecco il risultato in Alfa-Forex:

Uno scambio è effettivamente fatto, ma non è nella storia nemmeno dopo 10 secondi. Che cos'è? Un bug di MT? Problema tecnico dell'alfa? Una specie di chip che non conosco? Alpari ha lo stesso script che funziona normalmente, solo occasionalmente lo zero viene rilevato al primo (zero) passo (beh, è comprensibile - la storia non ha ancora avuto il tempo di aggiornarsi), tutti gli altri passi sono uno. Ma dopo dieci secondi, perché non c'è nessun accordo nella storia?

 
Algo:

E ho qualche problema con HistorySelect(). Apro una posizione con lo script inviando un ordine a mercato, e se si è aperta un'operazione, controllo immediatamente il numero di operazioni nella storia dal lancio dello script, e lo controllo 10 volte ad un intervallo di un secondo. Ovviamente, ci dovrebbe essere un solo scambio, ecco lo script:

Ed ecco il risultato del broker Alpha:

Uno scambio è effettivamente fatto, ma non è nella storia nemmeno dopo 10 secondi. Che cos'è questo? Un bug di MT? Problema tecnico dell'alfa? Una specie di chip che non conosco? Alpari ha lo stesso script che funziona normalmente, solo occasionalmente lo zero viene rilevato al primo (zero) passo (beh, è comprensibile - la storia non ha ancora avuto il tempo di aggiornarsi), tutti gli altri passi sono uno. Ma perché non c'è nessun accordo nella storia in dieci secondi?

Quello che mi preoccupa è la seguente linea

datetime dtStartTime = TimeCurrent();

Siete sicuri che dtStartTime e TimeCurrent() non siano lo stesso numero per il momento? Forse l'arrotondamento a un secondo mette la transazione completata fuori da dtStartTime.

 
C-4:

La linea

datetime dtStartTime = TimeCurrent();

Siete sicuri che dtStartTime e TimeCurrent() non siano lo stesso numero per il tempo? Forse l'arrotondamento a un secondo mette la transazione completata fuori da dtStartTime.

E anche se è uno, MT non dovrebbe emettere la storia per quel secondo? Cioè non emette la storia entro i limiti specificati, COMPRESO i limiti stessi?

Ma comunque, ho provato a scrivere sia dtStartTime = TimeCurrent() - 1, sia dtStartTime = TimeCurrent() - 10. Non funziona.

Motivazione: