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

 

Ici, nous devons placer des ordres en attente et calculer leurs prix par rapport au prix de clôture de la barre précédente. BUYSTOP est placé, tandis que SELLSTOP renvoie l'erreur 130. Y a-t-il une erreur dans ce code ? Ou dans une autre fonction.

void SetOrders() {

double ldStop=0, ldTake=0 ;
int spr=MarketInfo(Symbol(), MODE_SPREAD) ;
double PredBar=iClose(NULL,PERIOD_M5,1) ;
double pAsk=PredBar+(DistanceSet+spr)*Point ;
double pBid=PredBar-(DistanceSet+spr)*Point ;

si (!ExistOrder(1)) {
si (StopLoss!=0) ldStop=pAsk-StopLoss*Point ;
si (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point ;
SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1) ;
}
si (!ExistOrder(2)) {
si (StopLoss!=0) ldStop=PredBar+(StopLoss*Point) ;
si (TakeProfit!=0) ldTake=pBid-TakeProfit*Point ;
SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2) ;
}
}
 
Pomid:

Ici, nous devons placer des ordres en attente et calculer leurs prix par rapport au prix de clôture de la barre précédente. BUYSTOP est placé, tandis que SELLSTOP renvoie l'erreur 130. Y a-t-il une erreur dans ce code ? Ou dans une autre fonction.

void SetOrders() {

  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double PredBar=iClose(NULL,PERIOD_M5,1);
  double pAsk=PredBar+(DistanceSet+spr)*Point;
  double pBid=PredBar-(DistanceSet+spr)*Point;

  if (!ExistOrder(1)) {
    if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
    if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
    SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
  }
  if (!ExistOrder(2)) {
    if (StopLoss!=0) ldStop=PredBar+(StopLoss*Point);
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
    SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
  }
}

Pourquoi ne pas vous adresser à l'auteur ? Il est toujours vivant et jeune, pas vieux ! Les coordonnées sont dans le code au-dessus de chaque fonction ! Tout le monde le connaît et le respecte !

Et apprenez à insérer du code comme celui-ci, avec SRC !

void SetOrders() {

  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double PredBar=iClose(NULL,PERIOD_M5,1);
  double pAsk=PredBar+(DistanceSet+spr)*Point;
  double pBid=PredBar-(DistanceSet+spr)*Point;

  if (!ExistOrder(1)) {
    if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
    if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
    SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
  }
  if (!ExistOrder(2)) {
    if (StopLoss!=0) ldStop=PredBar+(StopLoss*Point);
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
    SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
  }
}

Vous avez manipulé la PredBar sans la comprendre, et voilà le résultat ! Apprenez d'abord les mathématiques !

 
Bonsoir, pourriez-vous me dire comment résoudre le problème de l'indicateur qui ne fonctionne pas sur la nouvelle version. Lors de la compilation, il y a une erreur 'TotalOrders' - illegal switch expression type (l'erreur est mise en évidence dans le code ). Salutations, Alexandre.
 for (i=0; i<k; i++)
   {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
    {
      if ((OrderSymbol()==Symb) && (OrderType()==op))
        {
            ko++;
            TotalOrders[ChartListPosition+1][ko][1]=NormalizeDouble(OrderOpenPrice(),dig);
            TotalOrders[ChartListPosition+1][ko][2]=NormalizeDouble(OrderStopLoss(),dig);
            TotalOrders[ChartListPosition+1][ko][3]=NormalizeDouble(OrderTakeProfit(),dig);
            TotalOrders[ChartListPosition+1][ko][4]=OrderTicket();
            TotalOrders[ChartListPosition+1][ko][5]=OrderLots();
            TotalOrders[ChartListPosition+1][ko][6]=OrderType();
            TotalOrders[ChartListPosition+1][ko][7]=OrderMagicNumber();
            TotalOrders[ChartListPosition+1][0][0]=ko;
           
              switch(TotalOrders[ChartListPosition+1][ko][6])
              {
               case OP_BUY:
                        Type="Buy";
                break;
                
               case OP_BUYSTOP:
                        Type="Buy Stop";

 for(int j=1;j<=OrdersCount;j++)  
      {
       
         switch(TotalOrders[ChartsListPosition+1][j][6])
          {
           case OP_SELL: 
               if (TotalOrders[ChartsListPosition+1][j][2]!=0 && 
                   ask>=(TotalOrders[ChartsListPosition+1][j][2]-NormalizeDouble(StopLevel*point,dig)))  
                   {
                    test=StopLossColor;
                   } 
                   else
                   {
                   if (TotalOrders[ChartsListPosition+1][j][3]!=0 && 
                       ask<=(TotalOrders[ChartsListPosition+1][j][3]+NormalizeDouble(StopLevel*point,dig)))
                      {
                       test=TakeProfitColor;
                      }
                   }
             break;       
 
karwin:
Bonsoir, pourriez-vous me dire comment résoudre le problème de l'indicateur qui ne fonctionne pas sur la nouvelle version. Lors de la compilation, il y a une erreur 'TotalOrders' - illegal switch expression type (l'erreur est mise en évidence dans le code). Salutations, Alexandre.

La variable doit être là, pas autre chose :

              int Переменная=TotalOrders[ChartListPosition+1][ko][6];
              switch(Переменная)
              {
               case OP_BUY:
                        Type="Buy";
                break;
                
               case OP_BUYSTOP:
                        Type="Buy Stop";
 

Bonjour camarades.

Pouvez-vous me conseiller, je ne suis pas très familier avec MT5, je ne l'ai pratiquement jamais utilisé, lors des tests, seul un cœur de CPU est engagé, j'en ai 8, pourquoi ? Comment puis-je le réparer ?


 
7Konstantin7:

Bonjour camarades.

Pouvez-vous me conseiller, je ne suis pas très familier avec MT5, je ne l'ai presque jamais utilisé, lors des tests, seul un cœur de CPU est engagé, j'en ai 8, pourquoi ? Comment puis-je le réparer ?


Vous devriez demander dans le cinquième forum
 
7Konstantin7:

Bonjour camarades.

Pouvez-vous me conseiller, je ne suis pas très familier avec MT5, je ne l'ai pratiquement jamais utilisé, lors des tests, seul un cœur de CPU est engagé, j'en ai 8, pourquoi ? Comment puis-je le réparer ?


Est-ce pour les tests ou pour l'optimisation ? Si vous ne faites qu'un test, un seul cœur fonctionne, mais si vous activez l'option "Optimiser" dans le testeur de stratégie, tous les cœurs du processeur fonctionneront.
 
borilunad:

Vous avez manipulé la PredBar sans comprendre, voilà le résultat ! Apprenez d'abord les mathématiques !

Merci, je l'ai appris, je l'ai corrigé.
 
evillive:
vous devriez le demander sur le cinquième forum

"Je ne suis pas membre du site, c'est pourquoi j'ai posé la question ici.

barabashkakvn:
Est-ce pendant les tests ou l'optimisation ? Si vous ne faites que tester - un seul cœur fonctionne, mais lorsque vous activez l'option "Optimiser" dans le testeur de stratégie, tous les cœurs du processeur fonctionneront.

J'ai tout compris, merci à tous. Pendant le test, un noyau fonctionne et tout fonctionne comme il se doit,

Je ne comprends pas pourquoi ils n'ont pas simplement utilisé la pleine puissance du processeur dans le test.

 
7Konstantin7:

"Je ne suis pas membre du site, c'est pourquoi j'ai posé la question ici.

J'ai tout compris, merci à tous. Pendant le test, un noyau fonctionne et tout fonctionne comme il se doit,

Je ne comprends pas pourquoi ils n'utilisent pas toute la puissance du processeur lors des tests.

Et pourquoi devrions-nous charger tous les cœurs pendant les tests (sans optimisation activée) ? Après tout, si l'on teste avec visualisation, on n'est pas pressé, et si l'on teste sans visualisation, les ordinateurs modernes exécutent cette tâche comme des graines de tournesol sur un seul cœur.
Raison: