Il grande e terribile MT4 per sempre (o come strategizzare una transizione) - pagina 24

 
Artyom Trishkin:
In russo? In spagnolo? In inglese? Quale?

naturalmente in tutte le lingue che il terminale supporta

il formato non ha importanza - può essere un SB sotto forma di una classe dove il costruttore riceve il linguaggio come parametro

o può essere un gruppo di funzioni personalizzate con la lingua che termina GetTxtErrDescription_RU()

o anche una normale funzione come GetLastError()

se lo desideri


OK, lascia perdere, ho tutto, e il mio rango non permette di occuparsi del benessere universale, lascia che persone appositamente formate si occupino di usabilità e userfriendly

 

Ho indovinato perché la tua posizione è doppia.))) Perché hai messo due librerie in CodeBase)))


 

Perché non ti piace GetTickCount(); non rallenta l'intero codice, a differenza di Sleep, puoi almeno aggiungere 500ms se il ping è alto,

Nel mio multisimbolo, per ogni coppia si attiva un contatore separato dopo OrderSend, il resto della logica continua a funzionare

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:

Perché non ti piace GetTickCount(); non rallenta l'intero codice a differenza di Sleep, puoi almeno aggiungere 500ms se il ping è alto,

È un ciclo attivo e mangia il processore. Cosa succede se ci sono 50 Expert Advisors di questo tipo nel terminale? Ce ne sono 8 su una coppia dove tutti e 8 invieranno ordini su un picco.

 
traveller00:

È un ciclo attivo e mangia la CPU. E se ci sono 50 Expert Advisors nel terminale? Ce ne sono 8 su una coppia dove sul tornante tutti e 8 manderanno ordini.

Si attiva per mezzo secondo e solo dopo l'invio dell'ordine non c'è nessun comando per esso e poi controlla prima la presenza delle posizioni aperte

Ho ottimizzato il mio codice, è diventato più veloce e ha iniziato ad aprire 2 posizioni alla volta) all'inizio Sleep ha aiutato, ma stava rallentando le cose, ho 7 caratteri
 
fxsaber:

Non ho ancora provato lo stile MT4, ma teoricamente dovrebbe funzionare. Non ho ancora avuto la possibilità di guardarlo.

Funziona. È stato interessante confrontare due versioni (con e senza attesa di posizione).


Con posizione in attesa dopo 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());
}


Senza aspettare la posizione, il risultato è immediato.

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


Ero sicuro che la seconda variante fosse più veloce. Si è rivelato uguale nel tempo di esecuzione.


Quando si aspetta la posizione ByPass.Is(), il codice ha restituito false una volta, mentre senza aspettare ha restituito 740 volte. Tutto sommato, la stampella sembra funzionare.

 
Sembra essere l'unica soluzione funzionante presentata.

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Il grande e terribile MT4 per sempre (o come costruire la tua strategia di migrazione)

Igor Makanu, 2021.05.10 10:28

sembra funzionare:

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

Ma molto lento, e la soluzione è così così.

La sua velocità è ok. Mancanza di sincronizzazione 37 volte.

 
fxsaber:

La sua velocità è normale. Mancanza di sincronizzazione 37 volte.

Ho controllato su fx: questo script ha aperto 10 ordini 5 volte velocemente, e l'ultima volta che sono stato veloce, quando ho aperto 10 ordini per 10 secondi sulla demo, anche la chiusura degli ordini non era veloce.

Ecco un graffio sul registro per l'ordine 11143290:

LL 0 11:19:31.444 Trades '20615687': ordine #11143290 compra 0.1 / 0.1 EURUSD a mercato fatto in 1580.643 ms

PO 0 11:19:33.621 Trades '20615687': affare #1865643 comprare 0.1 EURUSD a 1.21460 fatto (basato sull'ordine #11143290)

CL 0 11:19:33.622 Trades '20615687': market buy 0.1 EURUSD

JF 0 11:19:33.679 Trades '20615687': accettato acquisto sul mercato 0,1 EURUSD

QO 0 11:19:33.679 Trades '20615687': market buy 0.1 EURUSD placed for execution

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': accettato mercato vendere 0,1 EURUSD, chiudere #11143290 comprare 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 [L'ordine di chiudere questa posizione esiste già]

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 [Ordine di chiudere questa posizione esiste già]

 
Igor Makanu:

Ho appena controllato sul fx...n.

Dovrò dare un'occhiata a quel server. Sarebbe bene controllare la stampella suggerita qui, per chi sembra importante.

Tornare su questo argomento dopo un po' di tempo sarebbe molto riluttante. Meglio segnalare subito i bug, se ce ne sono.

 
fxsaber:

Dovrò dare un'occhiata a questo server. Sarebbe bene controllare la stampella suggerita qui, per chi sembra importante.

Non vorrei tornare su questo argomento dopo un po' di tempo. Meglio segnalare subito i bug, se ce ne sono.

Nel PM ha lanciato il server