Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1802

 
Artyom Trishkin #:

Dobro. Laissez-moi l'exprimer en termes russes simples.

Vous allez à la pêche.

  1. Vous ouvrez le garde-manger à la maison, vous vous grattez la tête et vous le refermez.
  2. Vous allez à la pêche et vous avez besoin d'une canne à pêche.
  3. Vous allez à la réserve pour acheter une canne à pêche.
  4. Vous êtes allé à la pêche, vous avez lancé votre canne et attrapé un poisson, puis vous avez eu besoin d'un filet.
  5. Je suis allé à la réserve pour le filet.
  6. Vous êtes allé pêcher, vous avez ramassé le poisson que vous aviez attrapé et qui flottait sur l'hameçon avec le filet, et vous aviez besoin d'un récipient pour conserver le poisson que vous aviez attrapé
  7. Rentrez chez vous pour ..... Dois-je continuer ?

Ou bien vous pouvez prendre directement tout ce dont vous avez besoin dans le garde-manger (OnInit), pêcher sans courir partout et, en rentrant chez vous, tout ranger dans le garde-manger et le réfrigérateur (OnDeinit).

Vous le saviez peut-être ici sur le forum. Il faut juste écouter et entendre ce qu'on vous dit parfois.

Sinon, on vous pose une question, on vous répond, on vous dit "conneries" et on fait ce qu'on pense.

Vous devez d'abord réfléchir à la question, poser des questions, puis commencer à rédiger.

Savez-vous que la chose la plus simple en programmation est l'impression du code ? Et la part du lion du développement est la réflexion sur la logique.

C'est une analogie ridicule. Dans ce cas, faisons en sorte que toutes les variables, les objets de classe, etc. soient globaux et ne les créent pas à la demande, ou peut-être qu'un objet graphique est autre chose (certainement pas une canne à pêche ou un filet :)). ? Mon approche est donc tout à fait rationnelle et justifiée, c'est juste que mql ou metatrader se plante.

 
MakarFX #:
De cette façon, le signal sera manqué

Soit je suis obtus, soit il n'y a pas de condition s'il y a des ordres ouverts ET qu'il y a un signal et que la barre est déjà nouvelle.

Si les signaux sont longs, plus d'une barre multiple, il fonctionnera également sur le premier tick de la barre.

La seule question est de savoir quand ouvrir un ordre, lorsque le signal apparaît ou au premier tick de la barre suivante.
 
Valeriy Yastremskiy #:

Soit je suis obtus, soit il n'y a pas de condition s'il y a des ordres ouverts ET qu'il y a un signal et que la barre est déjà nouvelle.

Si les signaux sont longs, plus d'une barre multiple, il fonctionnera également sur le premier tick de la barre.

La seule question est de savoir quand l'ordre doit être ouvert, au moment du signal ou au premier tick de la barre suivante.
Je vous demande d'ouvrir un ordre par barre
 
законопослушный гражданин Sleep(), mais Makar a dit qu'il serait mieux de ne pas arrêter le processus.


Le code ressemble maintenant à ceci :

Avant d'ouvrir, vérifiez s'il existe une position ouverte sur cette bougie. Si ce n'est pas le cas, ouvrez-le.

 
законопослушный гражданин #:

En principe, un ordre ouvert devrait normalement se clôturer sur les ticks d'une barre déjà ouverte. MakarFX et Artem ont bien noté. Par conséquent, la bonne chose à faire serait de le faire :

void OnTick()
  {
  datetime cTime;
  static datetime time = 0;
  int nOrders;

  cTime = iTime(NULL, PERIOD_CURRENT, 0);

  nOrders = CountOrders();

  if (time != cTime && nOrders == 0)
    time = cTime;
  else
    return;

// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(nOrders == 0) // теперь это условие можно убрать
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
   }
 
Mihail Matkovskij #:

En principe, un ordre ouvert devrait normalement se clôturer sur les ticks d'une barre déjà ouverte. MakarFX et Artem ont bien noté. Par conséquent, la bonne chose à faire est la suivante :

Artem a raison, ça devrait être comme ça.

//+-----------------------------------------------------------------------------------------------+
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров и появился сигнал на покупку, то откроем ордер на покупку
   if(CountOrders()==0&&bSignalBuy())
     {
      vOrderOpenBuy();
     }
// Если нет открытых ордеров и появился сигнал на продажу, то откроем ордер на продажу
   if(CountOrders()==0&&bSignalSell())
     {
      vOrderOpenSell();
     }
   }
 
MakarFX #:

Tu as raison, Artem, ça devrait être comme ça.

Le résultat sera le même ici. Seul le code est plus compliqué. Vous écrivez le même code dans deux fonctions différentes. Et il sera moins lisible. Bien que chacun écrive comme il l'entend ou se sente à l'aise...

 

Il y a beaucoup de choses qui se passent ici.

Un poste ouvert a une heure d'ouverture. L'heure d'ouverture peut être comparée à l'heure d'une bougie - pour savoir si l'heure d'ouverture de la position est à l'intérieur de la bougie (et c'est la bougie actuelle).

Et pourquoi trouve-t-on toujours le nombre de commandes dans tous les exemples ? Et s'il n'y a pas de commandes, alors vous les ouvrez. Cela limite considérablement les possibilités.

En général, nous ne devrions nous concentrer sur le nombre d'ordres/de positions que pour une orientation stratégique très étroite.

 
Mihail Matkovskij #:

Le résultat ici sera le même. Seul le code est plus confus. Vous écrivez le même code dans deux fonctions différentes. Et il sera moins lisible. Bien que chacun écrive comme il l'entend ou se sente à l'aise...

Votre code

  if (time != cTime && nOrders == 0)
    time = cTime;

(Un bar a été ouvert et aucun ordre n'a été passé)

vérifié pour un signal - pas de signal

... on attend la prochaine barre.

Vous avez répété la même erreur que la dernière fois

P.S.

c'est

 time = cTime;
doit être effectuée après l'ouverture de la commande
 
MakarFX #:

Tu as raison, Artem, ça devrait être comme ça.

Dans votre code, si une position est ouverte, une autre ne s'ouvrira pas par le signal opposé. C'est-à-dire que, tout d'abord, lorsque le signal arrive, vous devez vérifier s'il existe une position opposée et la fermer.

Mais là encore, tout cela limite considérablement les possibilités d'améliorer les stratégies.

Nous devons éviter de nous lier à la présence/absence d'ordres (surtout en quatre - ordres en attente (ce qui est correct) et positions (ce qui est faux)).

Non, il est correct et nécessaire d'avoir à portée de main le nombre d'ordres et de positions selon leurs types. Mais il est erroné de se baser sur l'absence d'ordres uniquement pour les signaux.

En général, la bonne méthode consiste à avoir des fonctions pour compter les ordres et les positions (une fonction qui remplit la structure lorsque le nombre d'ordres et de positions change), des fonctions pour ouvrir/fermer les positions, des fonctions pour définir les ordres et des fonctions d'alarme. Fonctions des différents chaluts et obtention de données à partir d'indicateurs. Plus - possibilité de comparer les données d'une position (ouverte ou fermée) avec certaines valeurs.

Toute stratégie peut être construite à partir de cet ensemble.