Diskussion zum Artikel "Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XXI): Handelsklassen - Basisklasse des Handels, Verifikation der Einschränkungen" - Seite 2

 
Artyom Trishkin:

Was steht also nach der Ereignisverarbeitung am Ende des Ereignistyp-Prüfmoduls in der Variablen last_event? Das ist es, was Sie im EA zurücksetzen müssen. Und nicht zwangsweise die Methode zum Zurücksetzen des letzten Ereignisses der Bibliothek aufrufen - die Bibliothek selbst ruft es direkt nach dem Senden des Ereignisses an den Chart und schreiben es in die Liste der Ereignisse.

Ja. Ich habe es einfach übersehen und keine Zeile am Ende eingefügt.

last_event = engine.LastTradeEvent();
 
Alexey Viktorov:

Ja. Ich habe nur eine Zeile am Ende übersehen.

Sie können es einfach mit TRADE_EVENT_NO_EVENT gleichsetzen.
 
Artyom Trishkin:
Sie können es einfach mit TRADE_EVENT_NO_EVENT gleichsetzen.

Es funktioniert nicht. Es wird bei jedem Tick gedruckt. Der Auftrag wird beim fünften Tick aktiviert, es wird 4 Mal "1" im Protokoll gedruckt und dann wird bei jedem Tick "20" gedruckt.

//--- Wenn sich das letzte Handelsereignis geändert hat
 if(engine.LastTradeEvent() != last_event)
  {
   last_event=engine.LastTradeEvent();
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
     Print(__FUNCTION__, "***", last_event);
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
     
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      {
       Print(__FUNCTION__, "***", last_event);
       //OrderActivated();
     break;
      }
     case TRADE_EVENT_POSITION_OPENED :
     
     break;
     case TRADE_EVENT_POSITION_CLOSED :
     
     break;
//---
     
     default :
      break;
    }
   last_event = TRADE_EVENT_NO_EVENT;
  }
 
Alexey Viktorov:

Es funktioniert nicht. Er druckt bei jedem Tick. Der Auftrag wird beim fünften Tick aktiviert, er druckt 4 Mal "1" im Protokoll und dann "20" bei jedem Tick.

Sie müssen sehen, was Sie dort erstellt haben. Es funktioniert in Test-Expert Advisors.
Ich bin auf meinem Handy. Ich werde in etwa fünf Stunden da sein.
 
Artyom Trishkin:
Wir müssen sehen, was Sie getan haben. Bei den Testberatern funktioniert es.
Ich bin auf meinem Handy. Ich werde erst in fünf Stunden da sein.

Ich habe noch nichts geschrieben. Oberhalb des Codes im vorherigen Beitrag steht nur dies.

//--- Initialisierung des letzten Handelsereignisses
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- Wenn Sie im Prüfgerät arbeiten
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
Und unten der Code, der zwei Aufträge OP_SELLLIMIT und OP_SELLSTOP öffnet
 
Alexey Viktorov:

Ich habe noch nichts erstellt. Oberhalb des Codes im vorherigen Beitrag ist nur dies.

Und unterhalb des Codes werden zwei Aufträge OP_SELLLIMIT und OP_SELLSTOP eröffnet.
Ich muss den ganzen Code sehen. Schicken Sie ihn in einer privaten Nachricht oder hier, wenn er nicht hinter sieben Siegeln versteckt ist.
 
Artyom Trishkin:
Ich muss den ganzen Code sehen. Schicken Sie ihn in einer privaten Nachricht oder hier, wenn er nicht hinter sieben Siegeln versteckt ist.

Es ist noch nichts da.

/********************************************************************\
|Nur_BUY_oder_nur_SELL.mq4 |
|© 2019, Alexey Viktorov |
| https://www.mql5.com/de/users/alexeyvik/news |
\********************************************************************/
#property copyright "© 2019, Alexey Viktorov"
#property link      "https://www.mql5.com/de/users/alexeyvik/news"
#property version   "1.00"
#property strict
#define  ndd(A) NormalizeDouble(A, _Digits)
//---
#include <DoEasy\Engine.mqh>
CEngine        engine;
//---
enum MY_ORDER_TYPE
{
 BUY   = OP_BUY,
 SELL  = OP_SELL,
};

struct POZ
{
 double profit;
 ulong  ticket;
 double priceGrid;
 double price;
}poz[];

sinput  MY_ORDER_TYPE   ordType         = SELL;   // Richtung des Handels
sinput  double          lot             = 0.01;   // Losgröße
 input  int             StepGrid        = 50;     // Rasterabstände
 input  double          desiredProfit   = 10;     // Gewünschter Gewinn
sinput  bool            Should_I_open   = false;  // Soll ich eine neue Reihe von Positionen eröffnen?
sinput  int             magick          = 1;      // Magische Zahl
//---
int slip = 100;
double contract, stepGrid, priceGrid;
int totalPositions, levelNumb;//, levelBUY, levelSELL;

/*******************Expert initialization function*******************/
int OnInit()
{
 stepGrid = StepGrid*_Point;
 return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
//--- Initialisierung des letzten Handelsereignisses
 static ENUM_TRADE_EVENT last_event = WRONG_VALUE;
//--- Wenn Sie im Prüfgerät arbeiten
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- Wenn sich das letzte Handelsereignis geändert hat
 if(engine.LastTradeEvent() != last_event)
  {
 //Drucken(__FUNCTION__, "***", letztes_Ereignis);
   last_event=engine.LastTradeEvent();
   switch(last_event)
    {
     case TRADE_EVENT_PENDING_ORDER_PLASED :
     Print(__FUNCTION__, "***", last_event);
     break;
     case TRADE_EVENT_PENDING_ORDER_REMOVED :
     
     break;
     case TRADE_EVENT_PENDING_ORDER_ACTIVATED :
      {
       Print(__FUNCTION__, "***", last_event);
       //OrderActivated();
     break;
      }
     case TRADE_EVENT_POSITION_OPENED :
     
     break;
     case TRADE_EVENT_POSITION_CLOSED :
     
     break;
     
     default :
      break;
    }
   last_event = TRADE_EVENT_NO_EVENT;
  }
 
 if(Should_I_open && OrdersTotal() == 0)
  {
   priceGrid = ndd(ordType == SELL ? Bid+stepGrid/2 : Bid-stepGrid/2);
   ENUM_ORDER_TYPE type = ENUM_ORDER_TYPE(ordType == OP_SELL ? OP_SELLLIMIT : OP_BUYSTOP);
   if(OrderSend(_Symbol, type, lot, priceGrid, slip, 0.0, 0.0, (string)priceGrid, magick) <= 0)
    Print(__FUNCTION__, GetLastError());
   priceGrid = ndd(ordType == SELL ? Bid-stepGrid/2 : Bid+stepGrid/2);
   type = ENUM_ORDER_TYPE(ordType == OP_SELL ? OP_SELLSTOP : OP_BUYLIMIT);
   if(OrderSend(_Symbol, type, lot, priceGrid, slip, 0.0, 0.0, (string)priceGrid, magick) <= 0)
    Print(__FUNCTION__, GetLastError());
  }
  return;
}/*******************************************************************/

void OrderActivated()
{
 Print(__FUNCTION__, "***", ENUM_TRADE_EVENT(engine.LastTradeEvent()));
 
}/*******************************************************************/

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
//--- Initialisierung des letzten Handelsereignisses
 static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
//--- Wenn Sie im Prüfgerät arbeiten
 if(MQLInfoInteger(MQL_TESTER))
  {
   engine.OnTimer();
  }
//--- Wenn sich das letzte Handelsereignis geändert hat
 if(engine.LastTradeEvent()!=last_event)
  {
   last_event=engine.LastTradeEvent();
  }
}/*******************************************************************/

/***************************Timer function***************************/
void OnTimer()
{
 if(!MQLInfoInteger(MQL_TESTER))
  engine.OnTimer();
}/*******************************************************************/

void OnDeinit(const int reason)
{
 Comment("");
}/*******************************************************************/
 
Alexey Viktorov:

Nun, da gibt es noch nichts.

Ich muss Ihren Code ausführen, um eine Antwort zu erhalten. Ich melde mich bei Ihnen, wenn ich dort bin.
 
Artyom Trishkin:
Ich muss Ihren Code ausführen, um eine Antwort zu erhalten. Ich werde da sein und auf Sie zurückkommen.

Ich weiß, dass Sie nicht zu Hause sind und ich will Sie nicht drängen.

 
Alexey Viktorov:

Ich weiß, dass du nicht zu Hause bist und ich dich nicht hetzen will.

Nein, ganz im Gegenteil - ich bin nicht bei der Arbeit, sondern zu Hause ;)