Der große und schreckliche MT4 für immer (oder wie man einen Übergang strategisch plant) - Seite 24

 
Artyom Trishkin:
Auf Russisch? Auf Spanisch? Auf Englisch? Welcher ist es?

natürlich in allen Sprachen, die das Terminal unterstützt

das Format spielt keine Rolle - es kann ein SB in Form einer Klasse sein, bei der der Konstruktor die Sprache als Parameter erhält

oder es kann eine Gruppe von benutzerdefinierten Funktionen mit der Sprachendung GetTxtErrDescription_RU() sein

oder sogar eine normale Funktion wie GetLastError()

wenn Sie es wünschen


OK, vergessen Sie es, ich habe alles, und mein Rang erlaubt es mir nicht, mich um das allgemeine Wohlbefinden zu kümmern, lassen Sie speziell ausgebildete Leute sich um die Benutzerfreundlichkeit kümmern.

 

Ich habe erraten, warum Ihre Position doppelt ist.))) Weil Sie zwei Bibliotheken in CodeBase platziert haben)))


 

Warum mögen Sie nicht GetTickCount(); es verlangsamt nicht den gesamten Code, im Gegensatz zu Sleep, können Sie mindestens 500ms hinzufügen, wenn der Ping hoch ist,

In meinem Multisymbol wird für jedes Paar ein separater Zähler nach OrderSend aktiviert, der Rest der Logik funktioniert weiter

void OnStart()
  {
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
//---
   while(1 && !IsStopped())
     {
      static uint LastOnCalculate = GetTickCount();
      if(GetTickCount() - LastOnCalculate > 5)
         //---
        {
         BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         OrderSend(BuyRequest, result);
         LastOnCalculate = GetTickCount();
         continue;
        }
      if(PositionGetTicket(0) > 0 && PositionsTotal() >= 10)
        {
         Sleep(100);
         Print(PositionsTotal());
         return;
        }
     }
  }
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
  {
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
  }
//+------------------------------------------------------------------+
 
Fast235:

Warum mögen Sie nicht GetTickCount(); es verlangsamt nicht den gesamten Code im Gegensatz zu Sleep, Sie können zumindest 500ms hinzufügen, wenn der Ping hoch ist,

Es handelt sich um eine aktive Schleife, die den Prozessor auslastet. Was ist, wenn es 50 solcher Expert Advisors im Terminal gibt? Es gibt 8 von ihnen auf einem Paar, wo alle 8 Befehle auf einem Spike senden werden.

 
traveller00:

Es handelt sich um einen aktiven Zyklus, der die CPU belastet. Was ist, wenn es 50 solcher Expert Advisors im Terminal gibt? Auf einem Paar befinden sich 8 von ihnen, während auf der Haarnadel alle 8 von ihnen Befehle senden werden.

Es wird für eine halbe Sekunde aktiviert und erst nach dem Absenden des Auftrags wird es nicht mehr angesteuert und prüft zunächst das Vorhandensein der offenen Positionen

Ich optimierte meinen Code, wurde es schneller und begann zu öffnen 2 Positionen zu einem Zeitpunkt) auf den ersten Schlaf geholfen, aber es war verlangsamt die Dinge, ich habe 7 Zeichen
 
fxsaber:

Ich habe den MT4-Stil noch nicht selbst ausprobiert, aber theoretisch sollte er funktionieren. Ich hatte noch keine Gelegenheit, sie mir anzusehen.

Es funktioniert. Es war interessant, zwei Versionen zu vergleichen (mit und ohne Warteposition).


Mit Warteposition nach OrderSend.

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  while (OrdersTotal() < 30)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


Ohne auf die Position zu warten, ist das Ergebnis sofort sichtbar.

#include <fxsaber\TradesID\ByPass.mqh>
#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  BYPASS ByPass;
  
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    if (ByPass.Is())
      ByPass += OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


Ich war mir sicher, dass die zweite Variante schneller war. Es stellte sich heraus, dass sie in der Zeit der Ausführung gleich war.


Wenn auf die Position ByPass.Is() gewartet wurde, gab der Code einmal false zurück, während er ohne Warten 740 Mal zurückgab. Alles in allem scheint die Krücke zu funktionieren.

 
Dies scheint die einzige funktionierende Lösung zu sein.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Der große und der schreckliche MT4 für immer (oder wie Sie Ihre Migrationsstrategie aufbauen)

Igor Makanu, 2021.05.10 10:28

es scheint zu funktionieren:

#include <Trade\Trade.mqh>
void OnStart()
{
   CTrade Trade;
   while(PositionsTotal() < 30)
   {
      if(OrdersTotal() > 0) continue;
      if(!Trade.Buy(0.01)) continue;
      if(OrdersTotal() == 0 && PositionsTotal() >= 30) return;
   }
}

Aber sehr langsam, und die Lösung ist mäßig.

Die Geschwindigkeit ist in Ordnung. Mangelnde Synchronisierung 37 Mal.

 
fxsaber:

Seine Geschwindigkeit ist normal. Mangelnde Synchronisierung 37 Mal.

Ich überprüfte auf fx: dieses Skript öffnete 10 Aufträge 5 mal schnell, und das letzte Mal war ich schnell, wenn ich 10 Aufträge für 10 Sekunden auf der Demo geöffnet, die Schließung der Aufträge war auch nicht schnell.

Hier ist ein Kratzer im Protokoll für die Bestellung 11143290:

LL 0 11:19:31.444 Trades '20615687': order #11143290 buy 0.1 / 0.1 EURUSD at market done in 1580.643 ms

PO 0 11:19:33.621 Trades '20615687': deal #1865643 buy 0.1 EURUSD at 1.21460 done (based on order #11143290)

CL 0 11:19:33.622 Trades '20615687': Marktkauf 0.1 EURUSD

JF 0 11:19:33.679 Trades '20615687': akzeptiert Marktkauf 0.1 EURUSD

QO 0 11:19:33.679 Trades '20615687': Marktkauf 0.1 EURUSD zur Ausführung platziert

KM 0 11:22:41.224 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

DR 0 11:22:41.280 Trades '20615687': akzeptiert Markt verkaufen 0.1 EURUSD, schließen #11143290 kaufen 0.1 EURUSD 1.21460

KQ 0 11:22:41.282 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460 placed for execution

ON 0 11:22:43.824 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

DO 2 11:22:43.880 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460 [Order zum Schließen dieser Position existiert bereits]

JN 0 11:22:46.280 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460

OL 2 11:22:46.336 Trades '20615687': market sell 0.1 EURUSD, close #11143290 buy 0.1 EURUSD 1.21460 [Order zum Schließen dieser Position existiert bereits]

 
Igor Makanu:

Ich habe gerade die fx...n überprüft.

Ich werde mir diesen Server ansehen müssen. Es wäre gut, die hier vorgeschlagene Krücke zu prüfen, für wen sie wichtig zu sein scheint.

Nach einer Weile auf dieses Thema zurückzukommen, wäre sehr widerstrebend. Es ist besser, gleich auf die Fehler hinzuweisen, wenn es welche gibt.

 
fxsaber:

Wir werden uns diesen Server ansehen müssen. Es wäre gut, die hier vorgeschlagene Krücke zu prüfen, für wen sie wichtig zu sein scheint.

Ich würde es hassen, nach einer Weile wieder auf dieses Thema zurückzukommen. Besser ist es, sofort auf die Fehler hinzuweisen, falls es welche gibt.

In der PM hat der Server