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

 
MarkTrade:


Ça marche... Merci !

J'aimerais juste comprendre pourquoi ma version ne veut pas fonctionner...

Vous ne voyez pas la différence ? Vous avez une mauvaise comparaison.

if (a && b < c) - vous ne pouvez pas faire ça.

if (a<c && b<c) - cela fonctionne

 
artmedia70:

Vous ne voyez pas la différence ? Vous avez la mauvaise comparaison.

if (a && b < c) - vous ne pouvez pas faire ça.

si (a<c && b<c) - vous pouvez.



Non, j'ai remarqué la différence. C'est juste que je croyais que c'était possible si (a && b < c)... :-)

Maintenant je le sais, merci !

 
MarkTrade:


Non, j'ai remarqué la différence. C'est juste que je croyais que c'était possible si (a && b < c)... :-)

Maintenant je vais savoir, merci !

Vous vouliez peut-être dire if(a+b < c) ? Alors tu peux le faire comme ça !
 
skyjet:


Merci encore ! J'ai maintenant essayé d'optimiser le nombre de barres "vérifiables", mais les résultats dans la fenêtre ne sont tout simplement pas là. J'ai essayé de commencer à compter depuis le début et depuis la fin, mais en vain.

extern int number=3;
//------------------------------------+
for (int x=number; x>1; x--) // x>1 (а не x>=1)
{
if(Open[x]==Open[x-1]) continue;
if(Open[x]<Open[x-1])
   {
    //--- action 1
   }
else
   {
    //--- action 2
   }
}

Que voulez-vous dire par "...aucun résultat dans la fenêtre" ? Peut-être que l'affichage des résultats dans la fenêtre est incorrect et qu'il y a une erreur ailleurs dans le programme ?

 

Cher Fellows ! Veuillez m'indiquer s'il existe de la littérature (des manuels) sur la programmation de lignes basées sur l'analyse technique, y compris les niveaux de Fibo. Il est souhaitable avec des exemples de code de programme "pour les nuls".

Ou qui peut suggérer un conseiller similaire avec un code source ouvert.

Je vous en remercie d'avance.

 
alexey1979621:

Chers camarades ! Veuillez m'indiquer s'il existe de la littérature (des manuels) sur la programmation de lignes basées sur l'analyse technique, y compris les niveaux de Fibo. De préférence avec des exemples de code "pour les nuls".

Je ne sais pas comment l'utiliser.

Je vous en suis très reconnaissant.

Qu'est-ce qui ne va pas avec ce manuel? Tout ce dont vous avez besoin, étudiez, pratiquez, bonne chance !
 
artmedia70:
Comprenez-vous et voyez-vous ce qui est contenu dans votre tableau immédiatement après qu'il ait été "rempli" de données de commande ? Non. Vous ne savez pas, vous ne faites que supposer. IMPRIMEZ le contenu de toutes les cellules du tableau, non pas avec votre pr(), mais avec la fonction standard Print() et essayez de regarder dans le journal du testeur pour voir ce que vous avez dans le tableau, dans chaque cellule, juste après qu'il soit rempli. Lorsque vous êtes certain que le contenu du tableau correspond à vos idées sur son contenu, imprimez-le avec votre pr(). Si vous n'obtenez pas les mêmes résultats, c'est votre pr(). Si les données correspondent, cherchez une erreur à l'étape suivante.

Les tableaux ont été imprimés, mais, pour l'instant, il ne s'agit pas d'eux. Je vais décrire ce que je pense ci-dessous.

Au fait. J'ai basculé toutes les sorties vers une impression standard. La situation est la même. Il apparaît le moment où 4 postes sont fermés en +. Et logiquement, la fonction isCloseByTakeLastOpenPos() devrait fonctionner, que j'appelle dès le départ comme ceci :

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))        // Наша функция, определяющая.. закрылся ли последний закрытый ордер в + или нет.
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1 && g_type < 6)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

qui nous indiquera que le dernier ordre clôturé est soit clôturé à la prise, soit au profit. Voici la fonction :

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   Print ("isCloseByTakeLastOpenPos: вошли в функцию");
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
      Print ("isCloseByTakeLastOpenPos: первоначальные условия выполнены!");

      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         Print ("j = " + j + "   " + TimeToStr(TimeCurrent()));
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
  //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
      if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
                 "\n", "j = ", j,
                 "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
      Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
              "\n", "j = ", j,
              "\n", "не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   Print ("isCloseByTakeLastOpenPos: последняя закрытая позиция профитна!");
   
   return (true);
}

La situation est intéressante. Tout fonctionne. Et c'est là que la situation apparaît :

Nous pouvons voir que 4 positions ont été clôturées avec un take profit. Ils ont été fermés par Takei. C'est-à-dire que les fonctions qui fermaient les ordres ne fonctionnaient pas du tout. La raison semble être que la condition de fermeture n'a pas fonctionné. C'est ça :

 if (isCloseByTakeLastOpenPos(2))

Lorsque nous examinons cette fonction et que nous imprimons tout, il devient clair qu'elle n'est pas devenue vraie à ce moment-là. Comment cela ? Après tout, les 4 ordres les plus éloignés ont fermé en +. J'ai donné le code de la fonction ci-dessus. Voici ce qui se trouve dans le journal au même moment :

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #104 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #102 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #100 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #98 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:03 2013.08.15 12:30 Tester: order #104, sell 0.93 EURUSD.GI is opened at 1.32831

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: j = 74 2013.08.15 12:30

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: вошли в функцию

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!


Nous pouvons voir que la condition n'a pas fonctionné. Qu'est-ce qui ne va pas ici ?

 
Pouvez-vous me dire s'il existe un indicateur qui détecte le spread sur l'ensemble du graphique ou s'il est possible de le faire ? Je n'ai trouvé qu'un indicateur qui enregistre l'écart entre le moment où le terminal est allumé et le moment où il est connecté.
 
paladin80:

Que voulez-vous dire par "...la fenêtre de résultats est juste vide". Peut-être que l'affichage des résultats dans la fenêtre est incorrect et qu'il y a une erreur ailleurs dans le programme ?


Mais je compare 3,2 et 1 barres, c'est-à-dire que le calcul est entravé par x >=1 ?

Et cela signifie-t-il que les barres ayant le même prix ne sont tout simplement pas prises en compte, qu'on ne leur attribue pas de numéro ?

En réglant les paramètres d'optimisation : start 1, step 1, end 4 ; sur H1 et H4 l'onglet des résultats est simplement vide, sur D1 la même rentabilité avec un nombre différent de barres analysées.

if(Open[x]==Open[x-1]) continue;
 

Les professionnels ne peuvent aller nulle part sans toi.

Aide pour la fonction. Ce qui compte le dernier nombre d'ordres perdants dans l'historique à un ordre plus.

Par exemple, l'historique montre 3 dernières commandes en moins, puis 1 en plus et 2 en moins.

Cette fonction devrait compter les trois derniers (avant l'ordre positif)

Raison: