Organiser le cycle de commande - page 14

 
Andrey Khatimlianskii:

L'OrderClose garantit-il la clôture de la transaction ?

Ce n'est pas garanti, mais il y a une vérification dans le code pour cela. Chaque appel OnTick est indépendant du précédent.

 
fxsaber:

Non garanti, mais il y a une vérification dans le code pour ce cas. Chaque appel OnTick est indépendant du précédent.

OK, la fermeture au prochain tic fera l'affaire.

 
@Artyom Trishkin,@Andrey Khatimlianskii, Merci pour votre participation ! Il est dommage que personne d'autre n'ait commenté le code MT5. Apparemment, ils pensent que tout va bien.
 
fxsaber:
@Artyom Trishkin,@Andrey Khatimlianskii, Merci de participer ! Il est dommage que personne n'ait commenté le code MT5. Apparemment, ils pensent que tout va bien.

Bien sûr, l'exemple a été donné pour répondre au fait que tout ne va pas bien du tout dans MT5. Exemple montrant le problème

// Пример неправильного считывания торгового окружения на каждом тике
// Скрипт эмулирует два тика ТС, которая должна открыть одну позицию, если ее нет.

#include <Trade/Trade.mqh>

// Возвращает количество позиций по символу
int GetAmountPositions( const string Symb )
{
  int Res = 0;
  
  // Этот MQL5-код с ошибкой
  for (int i = PositionsTotal() - 1; i >= 0; i--)
    if (PositionGetSymbol(i) == Symb)
      Res++;

/*
  // В MT4 такой код выполняется без ошибки
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL) && (OrderSymbol() == Symb))
      Res++;
*/      
  return(Res);
}

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (!GetAmountPositions(_Symbol))
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}

Que pensez-vous, si vous exécutez ce script sur un symbole sans positions, que se passera-t-il à la fin ?

La réponse correcte est qu'un ou deux postes seront ouverts.

 
fxsaber:

Bien sûr, l'exemple a été donné pour répondre au fait que tout ne va pas bien du tout dans MT5. Exemple montrant le problème

Que pensez-vous, si vous exécutez ce script sur un symbole sans positions, que se passera-t-il à la fin ?

La réponse correcte est qu'un ou deux postes seront ouverts.

En conséquence, la grande majorité des Expert Advisors MT5 de Kodobase ne sont pas écrits correctement !

 
fxsaber:
Peu de gens contesteront cette affirmation

C'est une règle universelle. Mais peu de gens pensent à sa mise en œuvre dans MT5. C'est pourquoi j'ai écrit un modèle des TS les plus simples (dans kodobase, presque tous les TS sont comme ça).

Pour une raison quelconque, certaines personnes écrivent plus de code pour le même TS. Mais en fait, ce code fait tout aussi bien l'affaire. La plupart des CT ne nécessitent que l'écriture de BuySignal et SellSignal. Rien d'autre n'est nécessaire.

Le modèle d'exemple est spécifiquement écrit avec SB. Alors question aux experts MT5, le code est-il correct ?

Je suis arrivé sur ce fil de discussion par accident, je voulais lancer un fil pour discuter des modèles de stratégie il y a longtemps. Votre modèle est assez proche de ce que je pense être correct (lisible pour moi), mais je n'aime toujours pas quand l'appel d'une fonction est inséré dans OnTick, qui cache tout un moulin à mine.

À un moment donné, j'ai même écrit MetaEditor : Relying on the power of templates. Depuis, le langage a changé, pas d'éditeur de modèles. Il serait intéressant de discuter de cette question (dans un fil distinct) et d'obtenir un article sur le sujet. Je pense que lorsqu'on écrit du code, il faut essayer de rendre la stratégie lisible d'un coup d'œil sans avoir à entrer dans les méthodes des classes ou des macros.

 
fxsaber:

En conséquence - la grande majorité des Expert Advisors MT5 de Kodobaz ne sont pas écrits correctement !

Comme toujours - catégoriquement. C'est impossible, bien que je n'aie pas lu votre code.

 
Rashid Umarov:

Cela fait longtemps que j'ai envie de lancer un fil de discussion sur les modèles de stratégie. Votre modèle est assez proche de ce que je pense être correct (lisible pour moi), mais je n'aime toujours pas quand l'appel d'une fonction est inséré dans OnTick, ce qui cache toute la minoterie.

Si vous faites OnTick == Strategy, le modèle va rétrécir/rétrécir à une taille obscène.

À un moment donné, j'ai même écrit un article intitulé MetaEditor : Building on the power of templates. Depuis, le langage a changé, il n'y a plus d'éditeur de modèles. Il serait intéressant de discuter de cette question (dans un fil distinct) et d'obtenir un article sur le sujet. Je pense que lorsqu'on écrit du code, il faut essayer de rendre la stratégie lisible d'un coup d'œil sans avoir à entrer dans les méthodes des classes ou des macros.

Voici comment se présentait le modèle pour les deux plateformes. C'est tellement simple qu'il est difficile d'en parler, même si pour MT5, c'est fondamentalement faux. Mais vous avez CExpert. Je n'ai pas regardé moi-même - c'est effrayant.

 
Rashid Umarov:

Comme toujours - catégorique. C'est impossible, bien que je n'aie pas lu votre code.

Vous l'avez lu, votre opinion est très intéressante.

 
fxsaber:

Bien sûr, l'exemple a été donné pour répondre au fait que tout ne va pas bien du tout dans MT5. Exemple montrant le problème

Que pensez-vous, si vous exécutez ce script sur un symbole sans positions, que se passera-t-il à la fin ?

La réponse correcte est qu'un ou deux postes seront ouverts.

Et si nous remplaçons GetAmountPositions par le standard OnTradeTransaction?

A peu près comme ça :

#include <Trade/Trade.mqh>
  int Res = 0;

// Возвращает количество позиций по символу
/*********************TradeTransaction function*********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol)
   {
    /******************** Если открылась позиция********************/
    if(PositionSelectByTicket(trans.position))
     Res++;
    /******************** Если закрылась позиция********************/
    if(!PositionSelectByTicket(trans.position))
     Res--;
   }
}/*******************************************************************/

// Пример OnTick
void ExampleOnTick()
{
  static CTrade Trade;
  
  // Если нет позиции, открываем
  if (Res == 0)
    Trade.Buy(1);    
}

// Эмуляция прихода двух Tick-событий
void OnStart()
{
  ExampleOnTick(); 
  
  Sleep(10); // Между двумя тиками ~10 мс.
  
  ExampleOnTick();
}