Come lavorare correttamente in MT5 con OrderSend - pagina 9

 
prostotrader:
https://www.mql5.com/ru/forum/97557/page4#comment_2891988
Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:

Spiacente, non ho voglia di occuparmi dei tuoi script

Aggiunto da

Ma c'è un modo per uscirne.

Poiché la funzione OrderrSend() è sincrona, dopo aver ricevuto l'ordine

assicurarsi che la storia sia sincronizzata in OnTradeTransaction()

//+------------------------------------------------------------------+
// Expert TradeTransaction function                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
    switch(trans.type)
     {
      case TRADE_TRANSACTION_ORDER_UPDATE:
         switch(trans.order_state)
           {
            case ORDER_STATE_PLACED:
               if(order_ticket==trans.order)
                 {
                  Print(__FUNCTION__," Order plased done. Ticket = ",trans.order);
                  if(order_ticket>0)
                    {
                     if(OrderSelect(order_ticket))
                       {
                        //Ордер синхронизирован с историей
                       }
                     else
                       {
                        Print(__FUNCTION__," Order not select! Ticket = ",trans.order);
                       }
                    }
                  else
                    {
                     Print(__FUNCTION__," Wrong order ticket = ",trans.order);
                    }
                 }
               break;
           }
         break;
     }
  }

E non si balla!

 
prostotrader:

Non si balla!

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

Come lavorare correttamente in MT5 con OrderSend

fxsaber, 2016.11.10 10:00

Si noti che questo è uno script e non ci può essere alcun Event-Over. L'unica via d'uscita è uno stupido Sonno.

Se riscrivete questo script con SB, non cambierà nulla.

 
fxsaber:
VOI potete diventare contorti quanto volete con Sleep....
 
prostotrader:
Si può scherzare con Sleep come si vuole....

Perché ripetere la stessa cosa che è già stata suggerita ed espressa prima da altri?

Il thread dice tutto sui possibili problemi con OnTradeTransaction. In particolare, riguarda il funzionamento di più Expert Advisors contemporaneamente.

La gente fa le stampelle, non significa che non conosce la documentazione e non sa come usare le funzioni.

OnTrade e OnTradeTransaction sono stati sviluppati esattamente per questo scopo. Quando hanno iniziato, gli sviluppatori pensavano che sarebbe stato idiota gestire più di un Expert Advisor simultaneamente in un conto.

Beh, su questo si sbagliavano.

Prova a scrivere la seguente funzione nel tuo Expert Advisor

  1. i = 0.
  2. Apriamo una posizione sul simbolo[i].
  3. Se i++ >= 5, usciamo.
  4. Se non c'è slittamento, si ritorna al passo 2. Se c'è slittamento, si esce.
 
fxsaber:

Perché ripetere la stessa cosa che è già stata suggerita ed espressa prima da altri?

Il thread dice tutto sui possibili problemi con OnTradeTransaction. In particolare, riguarda il funzionamento di più Expert Advisors contemporaneamente.

La gente fa le stampelle, non significa che non conosce la documentazione e non sa come usare le funzioni.

OnTrade e OnTradeTransaction sono stati sviluppati esattamente per questo scopo. Quando hanno iniziato, gli sviluppatori pensavano che sarebbe stato idiota gestire più di un Expert Advisor simultaneamente in un conto.

Beh, su questo si sbagliavano.

Prova a scrivere la seguente funzione nel tuo Expert Advisor

  1. i = 0.
  2. Apriamo una posizione sul simbolo[i].
  3. Se i++ >= 5, usciamo.
  4. Se non c'è slittamento, si ritorna al passo 2. Se c'è slittamento, si esce.

Attualmente, ho 41 Expert Advisors che lavorano su un conto reale (in un terminale) che insieme durante una giornata di trading

Hanno impostato 2000 ordini di apertura e chiusura delle posizioni e non sto riscontrando alcuna difficoltà!

Aggiunto

Per quanto riguarda la funzionalità che abbiamo, dovrebbe essere basata su ciò che abbiamo e non su ciò di cui abbiamo "bisogno".

Gli sviluppatori, se possibile, correggono i bug e gli errori, tenendo conto dei desideri di

utenti (anche se molto lentamente).

Penso che presto si occuperanno anche di OederSend().

 
prostotrader:

Ho 41 Expert Advisors sul mio conto reale (in un terminale) che lavorano tutti insieme durante una giornata di trading.

Impostano 2000 ordini, aprono e chiudono posizioni e non ho nessun problema!

Questo si chiama andare fuori tema.

Quando si tratta anche della logica più semplice.

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

Come lavorare correttamente in MT5 con OrderSend

fxsaber, 2016.11.15 13:30

Prova a scrivere la seguente funzione nel tuo EA

  1. i = 0.
  2. Aprire una posizione sul simbolo[i].
  3. Se i++ >= 5, usciamo.
  4. Se la nuova posizione non ha slippage, si ritorna al passo 2. Se c'è slippage, si esce.
Qualcuno lo scambia immediatamente.
// MQL4&5-code

#property strict

#include <MT4Orders.mqh>    // https://www.mql5.com/ru/code/16006

void Func( const string &Symbols[] )
{
  const int Total = ArraySize(Symbols);
  
  for (int i = 0; i < Total; i++)
  {
    const double Price = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);
    const int digits = (int)SymbolInfoInteger(Symbols[i], SYMBOL_DIGITS);
    
    if (!OrderSelect(OrderSend(Symbols[i], OP_BUY, 1, Price, 100, 0, 0, DoubleToString(Price, digits)), SELECT_BY_TICKET) ||
        (NormalizeDouble(Price - OrderOpenPrice(), digits) != 0)) // если не получилось открыть или есть проскальзывание - выходим
      break;
  }
}

void OnStart() // OnTick
{
  const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDCAD", "USDJPY"};
  
  Func(Symbols);
}

E qualcuno aspetta il mana dagli sviluppatori.
 

Ho già detto che siete liberi di rigirarla come volete (tutti hanno questo diritto).

 
prostotrader:

Ho già detto che siete liberi di torcere come volete (tutti hanno questo diritto).

è stato molto tempo fa, ma mi ricordo questo ragazzo, beh, questofxsaber ha fatto meraviglie,

i suoi codici sono ancora conservati nel codebase di MT4, il suo codice per leggere i siti su WinInet

è ancora usato da molti programmatori...

e quindi, mi sembra, non è un pervertito...

 
Strappato il OrderSendSync dalla libreria qui
uint OrderSend_MaxPause = 1000000; // максимальное время на синхронизацию в мкс.

const bool IsTester = (::MQLInfoInteger(MQL_TESTER) || ::MQLInfoInteger(MQL_OPTIMIZATION) ||
                       ::MQLInfoInteger(MQL_VISUAL_MODE) || ::MQLInfoInteger(MQL_FRAME_MODE));
                      
                      

bool Waiting( const bool FlagInit = false )
{
  static ulong StartTime = 0;

  if (FlagInit)
    StartTime = ::GetMicrosecondCount();

  const bool Res = (::GetMicrosecondCount() - StartTime < OrderSend_MaxPause);

  if (Res)
    ::Sleep(0);

  return(Res);
}

bool EqualPrices( const double Price1, const double Price2, const int digits)
{
  return(::NormalizeDouble(Price1 - Price2, digits) == 0);
}

#define WHILE(A) while (!(Res = (A)) && Waiting())

bool OrderSendSync( const MqlTradeRequest &Request, MqlTradeResult &Result )
{
  bool Res = ::OrderSend(Request, Result);

  if (Res && !IsTester && (Result.retcode < TRADE_RETCODE_ERROR) && (OrderSend_MaxPause > 0))
  {
    Res = (Result.retcode == TRADE_RETCODE_DONE);
    Waiting(true);

    if (Request.action == TRADE_ACTION_DEAL)
    {
      WHILE(::HistoryOrderSelect(Result.order))
        ;

      Res = Res && (((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_FILLED) ||
                    ((ENUM_ORDER_STATE)::HistoryOrderGetInteger(Result.order, ORDER_STATE) == ORDER_STATE_PARTIAL));

      if (Res)
        WHILE(::HistoryDealSelect(Result.deal))
          ;
    }
    else if (Request.action == TRADE_ACTION_PENDING)
    {
      if (Res)
        WHILE(::OrderSelect(Result.order))
          ;
      else
      {
        WHILE(::HistoryOrderSelect(Result.order))
          ;

        Res = false;
      }
    }
    else if (Request.action == TRADE_ACTION_SLTP)
    {
      if (Res)
      {
        bool EqualSL = false;
        bool EqualTP = false;

        const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS);

        if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position))
        {
          EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits);
          EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits);
        }

        WHILE((EqualSL && EqualTP))
          if ((Request.position == 0) ? ::PositionSelect(Request.symbol) : ::PositionSelectByTicket(Request.position))
          {
            EqualSL = EqualPrices(::PositionGetDouble(POSITION_SL), Request.sl, digits);
            EqualTP = EqualPrices(::PositionGetDouble(POSITION_TP), Request.tp, digits);
          }
      }
    }
    else if (Request.action == TRADE_ACTION_MODIFY)
    {
      if (Res)
      {
        bool EqualSL = false;
        bool EqualTP = false;

        const int digits = (int)::SymbolInfoInteger(Request.symbol, SYMBOL_DIGITS);

        if (::OrderSelect(Result.order))
        {
          EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits);
          EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits);
        }

        WHILE((EqualSL && EqualTP))
          if (::OrderSelect(Result.order))
          {
            EqualSL = EqualPrices(::OrderGetDouble(ORDER_SL), Request.sl, digits);
            EqualTP = EqualPrices(::OrderGetDouble(ORDER_TP), Request.tp, digits);
          }
      }
    }
    else if (Request.action == TRADE_ACTION_REMOVE)
      if (Res)
        WHILE(::HistoryOrderSelect(Result.order))
          ;
  }

  return(Res);
}

#undef WHILE
L'idea del codice dovrebbe essere chiara. Potrei aver trascurato qualcosa. Non ho notato alcun errore di funzionamento.
Motivazione: