Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 223

 
Nachmittags. Bitte helfen Sie einem Anfänger, einen geeigneten Advisor für den automatisierten Handel zu finden, der in der Lage ist, gesperrte Orders in Währungspaaren mit der Möglichkeit einer beliebigen Take-Profit-Einstellung zu eröffnen. Ich danke Ihnen.
 
abcxyzabcxyz:
Nachmittags. Bitte helfen Sie einem Anfänger, einen geeigneten Advisor für den automatisierten Handel zu finden, der in der Lage ist, gesperrte Orders in Währungspaaren mit der Möglichkeit einer beliebigen Take-Profit-Einstellung zu eröffnen. Ich danke Ihnen.
Wenn Sie wirklich ein Schloss brauchen, sind Sie hier richtig. Auf MetaTrader 5 gibt es keine Sperre, da MetaTrader 5 eine Netting-Plattform ist.
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle:
Alternativ: Deklarieren Sie Type-Methode in allen, in denen Typ-Identifikator zurückgeben.

Ha, wenn man den Quellcode bearbeiten könnte... Man muss die Dinge nicht so sehr vereinfachen. Und trotzdem - gibt es einen Klassennamen in mql5?

 
YAndrey:

Ha, wenn man den Quellcode bearbeiten könnte... Man muss die Dinge nicht so sehr vereinfachen. Dennoch - gibt es eine Möglichkeit für mql5, den Namen einer Klasse zu erfahren???

Schauen Sie in die Richtung der Vorlagen. Dieser Code gibt den Namen der Klasse oder eines primitiven Typs zurück.

#include<Handel.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
CTrade Handel;
double 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("Handel: Typ=",GetTypeName(Handel);
//---
}
//+------------------------------------------------------------------+
//| Gibt den Typ in Form einer Zeichenkette zurück|
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T&t)
{
//----Rückgabe des Typs als String
return(typenname(T))
//---
}

 
C-4:

Achten Sie auf Muster. Dieser Code gibt den Namen einer Klasse oder eines primitiven Typs zurück.

#include<Handel.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
CTrade Handel;
double 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("Handel: Typ=",GetTypeName(Handel);
//---
}
//+------------------------------------------------------------------+
//| Gibt den Typ in Form einer Zeichenkette zurück|
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T&t)
{
//----Rückgabe des Typs als String
return(typenname(T))
//---
}

Ich habe etwas gefunden! Aber es funktioniert nicht mit neuen - im Code gibt es ein Beispiel für das, was ich brauche - vielleicht kann jemand vorschlagen, wie?

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:

Ich habe etwas gefunden! Aber es funktioniert nicht mit neuen - es gibt ein Beispiel in den Code von dem, was ich brauche - kann jemand vorschlagen, alle Möglichkeiten?

Dies ist ein Problem der Vorlagenmethode. Leider gibt die Template-Methode den Namen der Klasse zurück, die die Instanz referenziert. Der Typ der Instanz selbst ist noch unbekannt.
 

Kann mir jemand erklären, warum dieser Code im Testprogramm nicht funktioniert, während er in Echtzeit funktioniert!!!? Insbesondere interessiert, warum in der Tester, nach HistorySelect(0, TimeCurrent()) die 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;

Screenshot im Strategietester:

Echtzeit-Screenshot in der Demo:

p.s. Interessant ist, dass die erste Bestellung im Testgerät korrekt verarbeitet wird, die anderen jedoch nicht. Wenn wir HistroryOrderSelect(ticketOrder) kommentieren, erhalten wir im Strategy Tester eine Meldung, dass die Bestellung nicht ausgewählt wurde, und im Strategy Tester funktioniert alles, außer der ersten Bestellung.

 

Und ich habe ein Problem mit HistorySelect(). Ich eröffne eine Position mit dem Skript, indem ich eine Marktorder sende, und wenn ein Geschäft eröffnet wurde, schaue ich mir sofort die Anzahl der Geschäfte in der Historie an, seit das Skript gestartet wurde, und überprüfe sie 10 Mal im Abstand von einer Sekunde. Offensichtlich sollte es einen Handel geben. Hier ist das Skript:

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

Und hier ist das Ergebnis in Alfa-Forex:

Es wird tatsächlich ein Handel getätigt, der aber nicht einmal nach 10 Sekunden in der Historie erscheint. Was ist das? Ein MT-Fehler? Alpha-Panne? Eine Art von Chip, den ich nicht kenne? Das Skript von Alpari funktioniert normal, nur gelegentlich wird beim ersten (Null-)Schritt eine Null erkannt (nun, das ist verständlich - der Verlauf hatte noch keine Zeit, sich zu aktualisieren), alle anderen Schritte sind Eins. Aber warum gibt es nach zehn Sekunden keinen Deal in der Geschichte?

 
Algo:

Und ich habe ein Problem mit HistorySelect(). Ich eröffne eine Position mit dem Skript, indem ich eine Marktorder sende, und wenn ein Geschäft eröffnet wurde, schaue ich mir sofort die Anzahl der Geschäfte in der Historie an, seit das Skript gestartet wurde, und überprüfe sie 10 Mal im Abstand von einer Sekunde. Offensichtlich sollte es einen Handel geben. Hier ist das Skript:

Und hier ist das Ergebnis des Alpha-Brokers:

Es wird tatsächlich ein Handel getätigt, der aber nicht einmal nach 10 Sekunden in der Historie erscheint. Was ist das? Ein MT-Fehler? Alpha-Panne? Eine Art von Chip, den ich nicht kenne? Das Skript von Alpari funktioniert normal, nur gelegentlich wird beim ersten (Null-)Schritt eine Null erkannt (nun, das ist verständlich - der Verlauf hatte noch keine Zeit, sich zu aktualisieren), alle anderen Schritte sind Eins. Aber warum gibt es keinen Deal in der Geschichte in zehn Sekunden?

Was mich stört, ist die folgende Zeile

datetime dtStartTime = TimeCurrent();

Sind Sie sicher, dass dtStartTime und TimeCurrent() nicht dieselbe Zahl für den Moment sind? Vielleicht liegt die abgeschlossene Transaktion durch die Aufrundung auf eine Sekunde außerhalb von dtStartTime.

 
C-4:

Die Linie

datetime dtStartTime = TimeCurrent();

Sind Sie sicher, dass dtStartTime und TimeCurrent() nicht die gleiche Zahl für die Zeit sind? Vielleicht liegt die abgeschlossene Transaktion durch die Rundung auf eine Sekunde außerhalb von dtStartTime.

Und selbst wenn es eine ist, sollte MT nicht die Geschichte für diese Sekunde ausgeben? D.h. gibt er nicht den Verlauf innerhalb der angegebenen Grenzen aus, und zwar EINSCHLIESSLICH der Grenzen selbst?

Trotzdem habe ich versucht, sowohl dtStartTime = TimeCurrent() - 1 als auch dtStartTime = TimeCurrent() - 10 zu schreiben. Funktioniert nicht.

Grund der Beschwerde: