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

 

Bon après-midi.

Ma stratégie prend en compte le spread, le spread est défini par une fonction :

double Spread_(){
   double spread = 0.0;
     RefreshRates();
     spread = MathRound((Ask - Bid) / Point);
   return(spread);
}   

Mais comme le spread est constant dans le testeur de stratégie, j'ai besoin d'un émulateur de spread aléatoire. Je veux émuler les changements d'écart dans le testeur dans la gamme de 2 à 3 points (4 chiffres) dans 80% des cas et plus de 3 points dans 20% des cas. Avez-vous des idées sur la manière de mettre en œuvre cette idée, ou des liens vers des sites où cette idée a été résolue ?

 
artmedia70:


L'erreur avec le magicien fait que votre EA ne voit pas que sa position est fermée sur un stop lorsqu'elle se ferme sur un stop. Pourquoi ? La réponse est que vous ouvrez une position avec magic 123 et envoyez la variable Magic à la fonction qui vérifie la fermeture de la position au stop. Que pensez-vous qu'elle soit égale lorsqu'elle est initialisée implicitement ? Zéro. La fonction recherche naturellement les positions avec le numéro magique 0 et il est égal à 123 dans vos positions. Et nous ne sommes pas en train de nous disputer, juste... ...raisonnement... Vérifiez la réaction de fermeture sur l'arrêt :


Je n'ai pas regardé le reste de la logique de ton EA "mort" - je t'aidais à comprendre la fonction de contrôle de fermeture de l'arrêt...


Artem ! Bonne journée ! Merci encore pour votre aide.

J'ai supprimé toutes les logiques "mortes" inutiles et "ranimé" celles qui restaient..... pour autant que je le comprenne.

Il ne reste qu'une fonction, que vous m'avez aidé à réparer.

Mais des miracles ont commencé à se produire au-delà de mon entendement.

1. Mon conseiller expert ouvre des positions au début de chaque bougie (j'ai une bougie de 5 minutes).

et en ignorant toutes les conditions.

C'est-à-dire que le contrôle entre dans la première ligne

double Price=iOpen(Symbol (),0,0) ;

Et ensuite, il saute 11 lignes et arrive aux lignes suivantes

Lot=0.1 ;

OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point, "jfh",123 ) ;

2. si nous supprimons la ligne qui calcule le lot minimum Lot=MarketInfo(Symbol(), MODE_MINLOT);

Le conseiller expert fonctionne bien, mais la fonction isCloseLastPosByStop ne fonctionne pas.

Je me suis longtemps creusé la cervelle..... mais en vain. Je vous serais reconnaissant de bien vouloir me dire où se cache l'erreur.

double   Lot = 0.1;                                          //я проинициализировал переменную
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);                      //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();                                   //запоминаем количество всех открытых ордеров
      if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)      //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)       //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))  //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);                  //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                                                   //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else                                                    //в противном случае(если функция на вернула ??????
                     {
                     Lot=0.1;                                             // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                      
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

Solnce600:

Артем ! Добрый день! Еще раз спасибо за помощь.

Toute ma "logique morte" supprimée inutile et "ravivée" le reste..... pour autant que je le comprenne.

Je n'ai pratiquement laissé que la fonction, que vous m'avez aidé à corriger.

Mais les miracles, qui dépassent mon entendement, ont commencé à se produire.

Après

 if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))

ajoutez tout au corps { }

Désolé, je ne suis pas Artem.

 
ALXIMIKS:

Solnce600:

Après

ajoutez tout au corps { }

Je suis désolé, je ne suis pas Artem.

Merci. Pardonnez-moi pour la première fois....... (je ne sais pas comment ajouter l'émoticône de plaisanterie).
 
 t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );

t ou Lot ? ??

 
ALXIMIKS:

Solnce600:

Après

ajoutez tout au corps { }

Désolé, je ne suis pas Artem.

J'ai fait comme vous l'avez dit..... hélas le conseiller fonctionne .... la fonction isCloseLastPosByStop ne fonctionne pas

double   Lot=0.1;
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);  //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();               //запоминаем количество всех открытых ордеров
      if ((ot==0)                      //если ордеров в рынке никаких нет
      &&(Bid==Price)                   //И ПРИ ЭТОМ  если ПРИ ЭТОМ  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
               
                {
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);            //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                            //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     Lot=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else  //в противном случае(если функция на вернула??????
                     {
                     Lot=0.1; // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                     } 
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
 

Voici un morceau de code de la fonction bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)

Mais que se passe-t-il s'il y a un glissement de 3 pips ? Ce n'est pas très bien pensé ;))

 if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
 
solnce600:

Vous comprenez, cela ne me dérange pas vraiment pour l'instant. ....

Cela fait une semaine que j'essaie de comprendre pourquoi cette fonction ne fonctionne pas pour moi.

C'est-à-dire que j'ai besoin que l'ordre suivant s'ouvre avec un volume double de l'ordre fermé au stop, et que l'ordre suivant s'ouvre avec un volume régulier après le non-stop.


Corrigez la logique du travail, sinon il faudra beaucoup de temps pour réfléchir.
 
ALXIMIKS:

Voici un morceau de code de la fonction bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)

Mais que se passe-t-il s'il y a un glissement de 3 pips ? Ce n'est pas très bien pensé ;))


Vous comprenez, je ne m'en occupe pas encore. ....

Cela fait une semaine que je ne comprends pas pourquoi cette fonction ne fonctionne pas comme je le souhaite.

C'est-à-dire que je dois ouvrir l'ordre suivant après le stop avec un volume double de l'ordre qui s'est fermé au stop, et après le non-stop, l'ordre suivant est ouvert avec un volume régulier.
 

Et pourquoi toucher à l'historique des commandes? Regardez le solde - où il est allé dans cette direction et changez le lot.

S'il s'agit uniquement d'un robot qui effectuera des transactions sur votre compte.