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

 

Pouvez-vous me dire comment faire pour que l'indicateur n'affiche pas la valeur actuelle mais la valeur maximale des dernières barres Per, j'ai utilisé Osma comme exemple, mais il affiche la valeur actuelle dans le Strategy Tester lorsque le graphique est en mouvement et lorsque vous le mettez juste sur le graphique, rien :

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 1
#property   indicator_color1  Silver
#property   indicator_width1  2
//---- indicator parameters

extern int Per=12;
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- indicator buffers
double     OsmaBuffer1[];
double     OsmaBuffer[];
double     MacdBuffer[];
double     SignalBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
//---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexDrawBegin(0,SignalSMA);
   IndicatorDigits(Digits+2);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,OsmaBuffer1);
   SetIndexBuffer(1,OsmaBuffer);
   SetIndexBuffer(2,MacdBuffer);
   SetIndexBuffer(3,SignalBuffer);
   
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Moving Average of Oscillator                                     |
//+------------------------------------------------------------------+
int start()
  {
   
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd counted in the 1-st additional buffer
   for(int i=0; i<limit; i++)
      MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//---- signal line counted in the 2-nd additional buffer
   for(i=0; i<limit; i++)
      SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);
//---- main loop
   for(i=0; i<limit; i++)
      OsmaBuffer[i]=MacdBuffer[i]-SignalBuffer[i];
//---- done
   for(i=0; i<limit; i++)
    {
     for(int b=0; b<Per; b++)
      {
       OsmaBuffer1[i] =OsmaBuffer[ ArrayMaximum(OsmaBuffer,Per,b)];
      }
    } 
  return(0);
  }
Всё разобрался, перемудрил просто))), достаточно этого:
for(i=0; i<limit; i++)
    {
     OsmaBuffer1[i] = OsmaBuffer[ ArrayMaximum(OsmaBuffer,Per,i)];
    } 
 
borilunad:
Je comprends ça ! Mais comment programmer cette variable ("spread spécifié") ? Bien sûr, je peux créer une variable Spread et la modifier à chaque fois que je change la répartition dans le testeur. Disons que Spread(TestGenerator) ou qu'il existe une fonction, ou que vous pouvez d'une manière ou d'une autre créer une telle fonction, il est impossible que vous ne puissiez pas le faire ! А ?


Il y a un écart fixe, lors des tests,

mais avec la plupart des DCs, c'est variable. Si vous voulez, tenez-en compte dans le testeur. En général, il faut tester les conseillers experts dans les conditions les plus défavorables. C'est-à-dire avec un écart maximal, avec des retards possibles dans l'ouverture des ordres, etc.

 
Sepulca:


Il y a un écart spécifié, lors des tests,

mais avec la plupart des DCs, c'est variable. Si vous voulez, tenez-en compte dans le testeur. En général, testez les conseillers experts dans les conditions les plus défavorables. C'est-à-dire avec un écart maximal, avec des retards possibles dans l'ouverture des ordres, etc.

Je comprends et je fais tout ! Je voulais juste refléter l'écart que j'ai mis dans le prog, parce que dans le testeur Ask est souvent faussé, puis le trouver par Bid+spread ! Voir la branche MarketInfo ne fonctionne pas dans le testeur! Alors vous saurez ce qui ne va pas ! J'ai demandé là-bas, et personne ! Donc, déplacé ici, il a répondu là, pour lequel vous et d'autres vous remercient !
 
Chers collègues, aidez-moi à intégrer une fonction prête à l'emploi dans une EA.
 

Voici la fonction

bool isFlagHistoryPos(int mn=-1) {

date t ;

int gd = MarketInfo(Symbol(),MODE_DIGITS) ;

int i, j=-1, k=OrdersHistoryTotal() ;

for (i=0 ; i<k ; i++) {

si(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

si (OrderSymbol()==Symbol()) {

si (OrderType()==OP_BUY || OrderType()==OP_SELL) {

si (mn<0 || OrderMagicNumber()==mn) {

si (t<OrderCloseTime()) {

t=OrderCloseTime() ;

j=i ;

}

}

}

}

}

}

if(OrderSelect(j, SELECT_BY_POS,MODE_HISTORY)) {

double ocp=NormalizeDouble(OrderClosePrice(),gd) ;

double otp=NormalizeDouble(OrderTakeProfit(),gd) ;

si(MathAbs(ocp-otp)/Point<=TPpoint) return(true) ;

}

retour (faux) ;

Le conseiller expert lui-même est joint

/* Décompilé par Vinin */

 
borilunad:
Oui, je comprends et je fais tout ! Je voulais juste que l'écart que je fixe soit reflété dans le programme, car l'offre est souvent déformée dans le testeur, puis on la trouve via l'offre + l'écart ! Voir la branche MarketInfo ne fonctionne pas dans le testeur! Alors vous saurez ce qui ne va pas ! J'ai demandé là-bas, et personne ! Donc, déplacé ici, il a répondu là, pour lequel vous et d'autres vous remercient !

Merde, Boris. Je l'ai déjà écrit. Eh bien, vous pouvez imiter un spread flottant directement dans le conseiller expert. Qu'est-ce qui m'empêche d'ajouter un nombre aléatoire dans la fourchette du spread flottant à l'offre, et de l'ouvrir avec des ordres stop. Et fermez par la valeur, pas par des ordres d'arrêt. C'est plus compliqué que de définir un écart statique plus important, mais si vous en avez vraiment besoin, vous pouvez le faire. Dans le même temps, définissez l'écart minimum dans le testeur.

C'est juste que... une ligne de pensée.

 
artmedia70:

Merde, Boris. Je l'ai déjà écrit. Eh bien, faites un spread flottant simulé directement dans votre EA. Qu'est-ce qui vous empêche d'ajouter un nombre aléatoire dans la fourchette de spreads flottants à l'offre et d'ouvrir avec des ordres stop. Et fermez par la valeur, pas par des ordres d'arrêt. C'est plus compliqué que de définir un écart statique plus important, mais si vous en avez vraiment besoin, vous pouvez le faire. Dans le même temps, dans le testeur, définissez l'écart minimum.

C'est juste... Une façon de penser.

Merci Artem, c'est plus sage dans le bon sens du terme ! Je le ferai !
 

Aidez-nous à résoudre le problème, s'il vous plaît) J'ai écrit un Expert Advisor qui fonctionne en croisant les ondes, mais quand j'essaie de le tester, le terminal bipe et ne teste rien (le code du compilateur aime bien. Comment faire pour qu'il ait au moins quelque chose à montrer ?

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red
//---- indicator parameters
extern int RPeriod=13;
extern int RPrice=PRICE_CLOSE;
extern int RMethod=MODE_EMA;
//для желтой
extern int YPeriod=30;
extern int YPrice=PRICE_CLOSE;
extern int YMethod=MODE_EMA;
extern int Magic=17051994;
//профит и лось
extern int TakeProfit=150;
extern int StopLoss=30;
extern double lot=0.1;
double movingred,movingellow,SL,TP,movingred2,movingellow2;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
int kolpos=0,pos;  
     movingred=iMA(Symbol(),0,RPeriod,0,RMethod,RPrice,1);
     movingellow=iMA(Symbol(),0,RPeriod,0,RMethod,RPrice,1);
     movingred2=iMA(Symbol(),0,RPeriod,0,RMethod,RPrice,2);
     movingellow2=iMA(Symbol(),0,RPeriod,0,RMethod,RPrice,2);
         
        for(pos=0;pos <OrdersTotal();pos++)//считаю ордера чтобы советник не трогал в ручную выставленные ордера
        {
        OrderSelect(pos,SELECT_BY_POS,MODE_TRADES);
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic )
            {
            kolpos++;
            }
        }
        if (kolpos==0)
         {
              //условвие для покупок продаж
              if(movingred2>movingellow2 && movingred<movingellow && Volume[0]<5)//продаем 
                  {
                    OrderSend(Symbol(),OP_SELL,lot,Bid,10,Bid+StopLoss*Point,Bid-TakeProfit*Point,NULL,Magic,0,Green);
                  }
              if(movingred2<movingellow2 && movingred>movingellow && Volume[0]<5)//покупаем
                  {
                    OrderSend(Symbol(),OP_BUY,lot,Ask,10,Ask-StopLoss*Point,Ask-TakeProfit*Point,NULL,Magic,0,Red);
                  }
          }
   return(0);
  }
 
LBatters:

Aidez moi avec le problème, s'il vous plait) J'ai écrit un EA qui fonctionne en croisant les ondes, mais quand j'essaie de le tester, le terminal bipe et ne teste rien (le code du compilateur aime bien. Comment faire pour qu'il y ait au moins quelque chose à montrer ?

Est-ce que tu regardes parfois ce que tu as écrit ? !

Quelque chose me dit que "c'est là que réside le problème" :

     movingred=iMA(Symbol(),0,RPeriod,0,RMethod,RPrice,1);
     movingellow=iMA(Symbol(),0,RPeriod,0,RMethod,RPrice,1);
     movingred2=iMA(Symbol(),0,RPeriod,0,RMethod,RPrice,2);
     movingellow2=iMA(Symbol(),0,RPeriod,0,RMethod,RPrice,2);
 
LBatters:

Aide avec le problème, s'il vous plaît) J'ai écrit un Expert Advisor qui fonctionne sur le croisement des ondes, mais quand j'essaie de le tester, le terminal bipe et ne teste rien (le code du compilateur aime. Comment faire pour qu'il ait au moins quelque chose à montrer ?

//считаю ордера чтобы советник не трогал в ручную выставленные ордера

Où va-t-il le toucher ? Oui et il suffit de vérifier le magicien, le manuel sans magicien.


Et, comme écrit ci-dessus, les masses ne se chevauchent pas...