Et faisons-en un "dessin animé" (multidevises) - page 6

 
Swan >> :

erreur 130 tout le temps.

StopLevel doit être vérifié, pour StopLoss et Enter.


et icho

faut-il choisir le plus élevé ?


-130 probablement à cause d'une tentative de fixer un ordre en attente, et le prix est passé au-dessus ou au-dessous) dans le code il y a des lignes non complétées avec Marketlevel... c'est le suivi futur du prix, donc il n'y a pas cette erreur)

-La plus basse ou la plus haute de l'OrderOpenPrice pour le stop) Si achat, la plus basse H4 de la bougie 0 et 1... et le plus haut sommet pour une vente... En général, les valeurs les plus basses et les plus hautes pour l'arrêt

 
ALex2008 >> :

-130 probablement à cause d'une tentative de fixer un ordre en attente, et le prix est allé plus haut ou plus bas) dans le code il y a des lignes décommentées avec Marketlevel ... c'est le suivi du prix futur, de sorte qu'il n'y a pas cette erreur).

-La plus basse ou la plus haute de l'OrderOpenPrice pour le stop) Si vous achetez, choisissez la plus basse H4 de la 0 bougie et de la 1 bougie.... et le plus haut sommet pour une vente... En général, les valeurs les plus basses et les plus hautes pour l'arrêt

Pour y remédier, allez maintenant au plus bas pour l'achat et au plus haut pour la vente.

ou comme suit

StopLoss=MathMin(b0,b1);
StopLoss=MathMax(s0,s1);
 
Swan >> :

Rien à corriger, maintenant pour l'achat le plus grand bas est choisi, et le plus petit haut pour la vente.

Logiquement, ça l'est, d'accord !) Voici le choix pour l'arrêt (il est choisi le plus petit en ppt. des deux options)

Exemple :


Mais votre version est meilleure et plus simple... Je vais le corriger, mais en sens inverse) Merci.

StopLoss=MathMax(b0,b1);
StopLoss=MathMin(s0,s1);

Correction du code de la page 5.

 
ALex2008 >> :

Logiquement, ça l'est, d'accord !) Voici le choix pour l'arrêt (il est choisi le plus petit en ppt. des deux options)



Taki pour acheter le plus petit)

imho mieux vaut le plus gros et chaluter sur la première barre, logique différente :)


StopLevel.

vous pouvez modifier Enter

void UpTrend()
   {
   if(iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0
   && iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)
      {
      DellAllOrders();
      Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      if( Enter-Ask< StopLevel) Enter=Ask+ StopLevel;
      OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);
      }
   }

ou ouvrir une commande

void UpTrend()
   {
   if(iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0
   && iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)
      {
      DellAllOrders();
      Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      if( Enter-Ask< StopLevel)
      OrderSend(Symbol(), OP_BUY, 0.1, Ask, 0, 0, Ask+ Profit, 0, 0,0, Green);
      else 
      OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);
      }
   }

ou pensez à autre chose)

 
Swan писал(а) >>

taki pour acheter le plus petit)

je pense qu'il vaut mieux acheter avec le plus haut et chaluter sur la première barre, logique différente :)

Avec StopLevel.

vous pouvez modifier Enter

ou ouvrir une commande

ou vous pouvez trouver autre chose).

Le prix ouvert doit être suivi d'un niveau stop par rapport au Bid ou Ask. À partir du prix d'ouverture, prenez les positions Take et Stop qui ne doivent pas être plus proches que le niveau Stop. Mais pour eux, nous pouvons utiliser le bloc de clôture par profit ou par drawdown.

 
Swan >> :

...je pense qu'il vaut mieux prendre le plus gros et parcourir le premier bar, logique différente :)

Je l'ai fait de cette façon aussi... mais le résultat du test est meilleur à l'arrêt actuel)

 

Correction de l'arrêt de jeu...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         DellAllOrders();
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(Ask<= Enter- StopLevel){
         RefreshRates();
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         DellAllOrders();
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(Bid>= Enter+ StopLevel){
         RefreshRates();
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
      }
  }

   
//-------Вычисление стопа и утановка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if( Type==0){
            StopLoss=MathMax( b0, b1);//Функция возвращает максимальное из двух числовых значений
            if(Bid- StopLoss< StopLevel) StopLoss=MathMin( b0, b1); 
            else OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel) StopLoss=MathMax( s0, s1);
            else OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
   }


Swan >> :

...ou ouvrir une commande immédiatement.

(Il est beaucoup plus sûr d'entrer avec des ordres en attente) Sinon, votre société de courtage ou nofarms vous ouvrira très loin...))

>> J'ai modifié le code.

 
ALex2008 >> :

Corrigé le stopgap...


(Il est préférable d'utiliser les ordres en attente) Sinon, le DC montrera quelque chose ou les nofarms vous ouvriront très loin...))

>> J'ai corrigé le code.

Corriger les anciens bugs, en ajouter de nouveaux :D


Je l'ai aussi corrigé)

//+------------------------------------------------------------------+
//|                                                    CandyLite.mq4 |
//|                                                    Ш.Александр.В |
//|                                              shestovav@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Ш.Александр.В"
#property link      "shestovav@gmail.com"

#include <stdlib.mqh>

extern double Profit = 3000;

int Type, Ticket;
double Stop, StopLevel, b0, b1, s0, s1, StopLoss, Enter;
bool dwn, up, mod;

int init(){
   Profit*=Point; 
   return(0);
  }

int deinit() {
   return(0);
  }

int start() {
   StopLevel=Point*MarketInfo(Symbol(),MODE_STOPLEVEL);   // вычисление стоплевел //Point*
   
   if(! WorkOrders()){
      UpTrend();
      DownTrend();
   }
      
   if( WorkOrders()){
      if (( Type<=1)&& ( Stop==0)) SetStop();
      if (( Type==1)||( Type==5)) UpTrend();
      if (( Type==0)||( Type==4)) DownTrend();
   }

   return(0);
  }
//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         DellAllOrders();
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(Ask< Enter- StopLevel+0.5*Point){
         OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         DellAllOrders();
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(Bid> Enter+ StopLevel-0.5*Point){
         OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
      }
  }

//-------Вычисление стопа и установка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if( Type==0){
            StopLoss=MathMax( b0, b1);//Функция возвращает максимальное из двух числовых значений
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point)//можно попробовать убрать строку
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point)//можно попробовать убрать строку
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
   }
   
//-------Удаление всех ордеров, открытых и отложенных
void DellAllOrders(){
      if( WorkOrders()){
      if( Type<=1)OrderClose( Ticket,OrderLots(),OrderClosePrice(),10);
      else OrderDelete( Ticket);}
  }
  
//-------Поиск ордеров
bool WorkOrders(){
      for (int i=OrdersTotal()-1; i>=0; i--){
      if (!OrderSelect( i, SELECT_BY_POS))  continue;
      if (OrderSymbol()!=Symbol())        continue;
      Type  = OrderType();
      Ticket=OrderTicket();
      Stop  =OrderStopLoss();
      return(true);}
  return(false);
  }
 
Swan >> :

Corriger les anciens bugs, en ajouter de nouveaux :D

pour quoi faire ?

0.5*Point

Et MarketInfo() retourne le type double, pourquoi le convertir en Point... ?

Ça aussi... deux conditions.


if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
if(Bid- StopLoss> StopLevel-0.5*Point)//можно попробовать убрать строку

Je crois que c'est tout ce que j'ai remarqué. Il est préférable d'expliquer ce qui a été changé pour) que je puisse le garder à l'esprit pour l'avenir).

 
ALex2008 >> :

Je ne comprends pas...)

Et MarketInfo() retourne le type double, pourquoi le convertir en Point... ?

Celui-là aussi...


0,5*Point est un delta, vous pouvez aussi le convertir en 0,7 :)

Voir la comparaison des nombres réels.

fonctionnera probablement correctement sans lui. dans la plupart des cas)


l'erreur était

MarketInfo(Symbol(),MODE_STOPLEVEL)

il renvoie une valeur en pips. multipliée par Point.


C'était

            if(Bid- StopLoss< StopLevel) StopLoss=MathMin( b0, b1); 
            else OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

si vrai, une nouvelle valeur est attribuée à StopLoss,

Sinon, l'ordre est modifié.

pas d'erreur, mais je dois enlever une croix ou mettre un pantalon)

Raison: