Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 96

 
Vinin:

Vous êtes sûr d'avoir tous les appareils dentaires. Ils sont manquants à certains endroits. C'est pourquoi votre logique est erronée. Et il est fort probable que le résultat ne soit pas celui que vous attendiez.
Vitya, as-tu été absent ? Ça fait longtemps que je ne t'ai pas vu...
 
artmedia70:
Vitya, as-tu été absent ? Ça fait longtemps que je ne t'ai pas vu...


J'étais à la maison aujourd'hui (presque).
 
Vinin:

J'ai été à la maison aujourd'hui (presque)
Je suis presque à la maison pour la deuxième semaine :))
 
Vinin:

Vous êtes sûr d'avoir tous les appareils dentaires. Ils sont manquants à certains endroits. C'est pourquoi votre logique est erronée. Et le plus souvent, le résultat n'est pas celui que vous attendez.

Si vous voulez parler du code de l'indicateur, tout y est ok, l'indicateur fonctionne, donne des signaux sous forme de flèches (pour les tampons de l'indicateur acheter/vendre-4 et 5). Mais lorsque je lis ces flèches à partir de l'indicateur dans le conseiller expert, j'obtiens un non-sens. Je n'ai pas évoqué complètement le conseiller expert car l'essentiel est de comprendre comment lire le signal et faire l'opération correspondante. En général, le problème réside dans la lecture du signal.
 
paladin80:

Pour coller le code correctement ici, cliquez d'abord sur SRC et copiez ensuite le code à cet endroit.

Si je vous ai bien compris, à un moment donné, nous devons ouvrir un OP_BUYSTOP et un OP_SELLSTOP ? Est-il acceptable d'avoir d'autres ordres en attente en ce moment ? Par exemple, il y a des ordres en attente, mais avant d'en ouvrir un nouveau, il faut supprimer les anciens ?



if (hour1 == TimeHour(TimeCurrent()) && minute1 == TimeMinute(TimeCurrent()))// если время подошло то
{
min=Low[iLowest(Symbol(),0,MODE_LOW,6,1)]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest(Symbol(),0,MODE_HIGH,6,1)]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min;// общий объем локалки последних 6 свечей М5

if ((volum<=n)==true)// если объем свечей меньше или равно n пунктов 
{ 
OrderSend ( Symbol (), OP_BUYSTOP, параметры);// открываем отложенный ордер байстоп
OrderSend ( Symbol (), OP_SELLSTOP, параметры);// открываем отложенный ордер селлстоп
}

if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)&& OrderTakeProfit()==true) ///если первый открывшийся отложенный ордер закрыт с профитом
{
OrderDelete(1);// удаляем второй открытый отложенный ордер
}

}
bool closeorder;//определим  закрытие ордеров
closeorder=true;

if (closeorder==true)//
{
int hour2 = TimeHour(StrToTime(time2));// вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour(TimeCurrent()) && minute2 == TimeMinute(TimeCurrent()))// если время 
{
for(int i=OrdersTotal()-1; i>=0; i--)// определяем количество открытых позиций, и отложенных ордеров и закрываем все возможные позиции, и отложенные ордера
 if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES))break; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);// Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);//Закрытие ордера селл если такой есть
{
for(int D=OrdersTotal()-1; D>=0; D--)
if (OrderSelect(D,SELECT_BY_TICKET,MODE_TRADES)==true)
if (OrderType()==OP_BUYSTOP ) OrderDelete(D); //удаляем отложенный байстоп
if (OrderType()==OP_SELLSTOP) OrderDelete(D);// удаляем отложенный селлстоп

J'ai déjà collé le code générique pour le rendre plus clair... En fin de journée, je voulais fermer toutes les positions et tous les ordres possibles...

et au moment d'ouvrir deux ordres en attente (le matin), il n'y a pas d'ordres ouverts ou de positions ouvertes avant cela, puisqu'ils doivent tous être fermés à une certaine heure le soir. Je me demande si ma fermeture de commande complète est au moins correctement décrite ? =)))



 
artmedia70:

Honnêtement, je ne connais pas la logique de votre fonction. Je ne sais pas si elle doit supprimer les objets ou les construire. Dites-moi ce que vous voulez qu'il fasse et on verra où la logique est mauvaise. Toutefois, si la fonction tente de construire un objet graphique mais échoue, cela signifie qu'il existe déjà. Quelle est la prochaine étape logique de votre programme ? Vous pouvez construire un nouvel objet avec un nom différent (par exemple, ajoutez l'heure actuelle au nom de l'objet (TimeToStr(TimeCurrent())))) ou, si vous avez déjà un objet mais que vous devez modifier ses propriétés, ne le construisez pas à nouveau, mais modifiez simplement ses propriétés. Ensuite, l'erreur ne se reproduira plus.

C'est simple. L'essentiel est de savoir ce que vous voulez... :)



En fait, la fonction n'est qu'un substitut visuel de l'impression, elle affiche simplement tout à l'écran. Il n'est pas encore très bien écrit, mais il fonctionne. :) Je vais y aller et le réécrire. Et ensuite vous pouvez penser à la question qui était.

À propos, si vous ne construisez pas de nouveaux objets, mais modifiez les propriétés d'objets existants, alors là encore... Ça va être un mal de tête. L'idée est d'afficher les N derniers bancs à l'écran. Si nous écrasons toujours le dernier objet, nous pourrions nous retrouver avec un seul objet présentant un bogue particulier. Je pourrais aller plus loin et sélectionner dans une boucle autant d'objets que nécessaire et les réécrire uniquement, mais cela n'en vaut probablement pas la peine, puisque cette fonction ne sert qu'à tester et que je ne m'ennuie pas vraiment avec elle puisque j'ai déjà trop de choses à faire. Un jour, j'essaierai le code de cette fonction, et le ramènerai à la raison, et alors je pourrai y réfléchir !

 

Une question s'est posée. J'écris l'expérience suivante. J'ai un tas d'ordres qui, naturellement, s'ouvrent les uns après les autres en fonction de certains signaux. Si le dernier ordre est fermé, tous les autres ordres au marché et en attente devraient être fermés...

Bien sûr, tout peut être écrit à travers des tableaux, mais j'ai utilisé une méthode ordinaire. C'est parti :

for (int li_ord=OrdersTotal()-1; li_ord>=0; li_ord--)
   {
      if (!OrderSelect(li_ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();

      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

Condition :

 if (GetLastOrderState() != 0)

nous vérifions si le dernier ordre ouvert est fermé ! Ensuite, nous commençons à supprimer les ordres en attente et à fermer les ordres au marché...


Voici la fonction elle-même, afin qu'il n'y ait aucun doute sur le fait que quelque chose ne va pas avec elle(Les critiques et les commentaires sont les bienvenus, et même plus que bienvenus :)) ) :

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
double GetLastOrderState()
{
   double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
          lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   
   return (lastOrderCloseTime);
}
 
vovak_85:

Si vous parlez du code de l'indicateur - tout est bien là avec les crochets, l'indicateur fonctionne, donne des signaux sous forme de flèches (pour l'achat/la vente - 4 et 5 tampons d'indicateur). Mais lorsque je lis ces flèches à partir de l'indicateur dans le conseiller expert, j'obtiens un non-sens. Je n'ai pas évoqué complètement le conseiller expert car l'essentiel est de comprendre comment lire le signal et faire l'opération correspondante. En général, le problème réside dans la lecture du signal.
C'est à vous :
double L_B=iCustom(0,0,"Makedonskii",MM,MP,0,4);

double L_S=iCustom(0,0,"Makedonskii",MM,MP,0,5);

C'est comme ça que ça devrait être :
double L_B=iCustom(NULL,0,"Makedonskii",MM,MP,4,0);

double L_S=iCustom(NULL,0,"Makedonskii",MM,MP,5,0);
Quelque chose comme ça.
 
hoz:

En fait, la fonction n'est qu'un substitut visuel de l'impression, mais elle affiche tout à l'écran. Ce n'est pas encore très bien écrit, mais ça marche... :) Je vais y aller et le réécrire. Et ensuite vous pouvez penser à la question qui était.

A propos, si nous ne construisons pas de nouveaux objets, mais changeons les propriétés de ceux qui existent déjà, alors là encore... Ce serait un mal de tête. Par idée, nous devons afficher les N derniers joints à l'écran. Si nous écrasons toujours le dernier objet, nous pourrions nous retrouver avec un seul objet présentant un bogue particulier. Je pourrais aller plus loin et sélectionner dans une boucle autant d'objets que nécessaire et les réécrire uniquement, mais cela n'en vaut probablement pas la peine, puisque cette fonction ne sert qu'à tester et que je ne m'ennuie pas vraiment avec elle puisque j'ai déjà trop de choses à faire. Un jour, j'essaierai le code de cette fonction, et le ramènerai à la raison, et alors je pourrai y réfléchir !

J'ai réalisé une fois une fonction qui affiche des messages dans une fenêtre d'indicateur vide. Vous pouvez ajuster les couleurs des lignes affichées. C'est déjà débogué. Si vous en avez besoin, je peux le partager.
 
r772ra:
C'est à vous : ça devrait être comme ça :
Quelque chose comme ça.

merci pour la correction, mais l'algorithme n'a pas fonctionné correctement...