Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 706

 
Le terminal élimine simplement tous les caractères supplémentaires.

Si vous ouvrez avec ce volume :
0.029

il ouvrira 0.02 lots

et s'il s'ouvre avec ce volume :

NormalizeDouble(0.029,2)
il ouvrira 0.03 lots.
 
multiplicator:

Comment calculer le nombre de décimales?

Par exemple, j'ai découvert que le lot minimum est de 0,01.

Comment puis-je déduire que le nombre de décimales est de 2 ?
pour normaliser le volume de la commande à deux décimales.

voici le mot de passe:
void OnStart()
  {
  double minlot=MarketInfo(Symbol(),MODE_MINLOT);
  Alert(d(minlot));
  }




int d(double x)
{
   int n;
   for(n=0;n<8;n++)
   {
      if(x==NormalizeDouble(x,n))      
      {
         return(n);
      }
   }
return(n-1);
}
 
multiplicator:
Le terminal rejette simplement tous les signes supplémentaires.

Si nous ouvrons avec ce volume :

il ouvrira 0.02 lots.

et si vous ouvrez avec ce volume :

il ouvrira 0.03 lots.

Si vous avez besoin d'ouvrir 0,25 lot, voici des fonctions prêtes et fonctionnelles, lisez-les et utilisez-les.

https://www.mql5.com/ru/forum/131859/page8#comment_3359730


multiplicateur:

Par exemple, nous mettons la valeur dans la fonction : 7 lots.
Lecourtier a un volume de lot minimum de 5 et un incrément de lot de 2.

voici ma fonction f de normalisation de lot, je l'utilise depuis longtemps, personne ne s'est encore plaint, vous pouvez y trouver l'incrément de lot et ensuite l'arrondir au nombre de chiffres de l'incrément de lot

//_______________________________________________________________________
//Нормализация объема лота для ордера up=true - в большую сторону, иначе в меньшую
//_______________________________________________________________________
double NormalizeLot(double value, bool up=false){
   double res,sizetable[9] = {1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, 0.00000001};
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   int lotdigits;
   for (lotdigits=8; lotdigits>=0 ; lotdigits--) if (lotStep <= sizetable[lotdigits]) break;
   if(up) res = NormalizeDouble(MathCeil(MathMin(MathMax(value, MarketInfo(Symbol(),MODE_MINLOT)), MarketInfo(Symbol(),MODE_MAXLOT))/lotStep)*lotStep,lotdigits); 
         else res = NormalizeDouble(MathFloor(MathMin(MathMax(value, MarketInfo(Symbol(),MODE_MINLOT)), MarketInfo(Symbol(),MODE_MAXLOT))/lotStep)*lotStep,lotdigits);
return(res);}
//_______________________________________________________________________
Eh bien, si vous avez trouvé un serveur qui a une étape de lot, par exemple, 0,37, puis il ya seulement l'ajout et la comparaison au lot requis dans la boucle, mais il n'y avait pas de tels serveurs, il semble qu'il ya des lots non standard sur le bitcoin, je n'ai pas engagé, je ne sais pas, vous avez besoin d'une situation spécifique.
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Bonjour chers collègues, veuillez m'aider à épeler correctement la condition dans mon EA pour entrer une transaction sur les signaux de l'indicateur SHI_silvertrend_signal sur les options binaires, seulement OP_SELL et OP_BUY. pour M1 et M5. Le signal intervient à la clôture de la bougie précédente.


- Pour ouvrir un ordre au moment du signal de l'indicateur, uniquement sur la première bougie après le signal.

- pas plus de 5 secondes à partir du moment où le signal est reçu.

- Variation de prix autorisée dans le cadre du slippage



(L'indicateur a 2 tampons)

du commentaire de l'indicateur// les deux tampons doivent être remplis de zéros. Sinon, il y aura des déchets lors du changement de période.

Merci d'avance pour votre aide et votre soutien !

void OnTick()

{

.....

  if((CountSell() + CountBuy())== 0 && isTradeHours())

   {

      SignalBuy = iCustom(NULL, 0, "SST", AllBars, Otstup, Per, 0,0); //получаемое значение в формате 4546546549.0 

      SignalSell = iCustom(NULL, 0, "SST", AllBars, Otstup, Per, 1,0);



      if((Ask <= SignalBuy - Slippage*Point || Ask  <= SignalBuy + Slippage*Point) && iBarShift(NULL, 0,TimeSeconds(TimeCurrent())))    //<---- помогите дописать условие

      {

         if(OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0,IntegerToString(Expiration), Magic, 0, Blue) > 0)

         {

            Print("Ордер на покупку открыт!");

            return;

         }else Print("Ошибка открытия ордера на покупку!");

      }  

         

      if((Bid >= SignalSell - Slippage*Point || Bid >= SignalSell + Slippage*Point) && iBarShift(NULL, 0,TimeSeconds(TimeCurrent())))  //<---- помогите дописать условие

      {  

      if(OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0,IntegerToString(Expiration), Magic, 0, Red) > 0)

         {

            Print("Ордер на продажу открыт!");

            return;

         }else Print("Ошибка открытия ордера на продажу!");

      }

   }

}

.......

Le code de l'indicateur lui-même (trouvé sur Internet, si la publication du code n'est pas en contradiction avec les règles du forum ?)

//+------------------------------------------------------------------+
//|                                           SHI_SilverTrendSig.mq4 |
//|       Copyright © 2003, VIAC.RU, OlegVS, GOODMAN, © 2005, Shurka |
//|                                                 shforex@narod.ru |
//|                                                                  |
//|                                                                  |
//| Пишу программы на заказ                                          |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Shurka"
#property link      "http://shforex.narod.ru"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
#define   SH_BUY   1
#define   SH_SELL  -1

//---- Входные параметры
extern int     AllBars=0;//Для скольки баров считать. 0 - для всех.
extern int     Otstup=30;//Отступ.
extern int     Per=9;//Период.
int            SH,NB,i,UD;
double         R,SHMax,SHMin;
double         BufD[];
double         BufU[];
//+------------------------------------------------------------------+
//| Функция инициализации                                            |
//+------------------------------------------------------------------+
int init()
{
   //В NB записываем количество баров для которых считаем индикатор
   if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars;
   IndicatorBuffers(2);
   IndicatorShortName("SST");
   SetIndexStyle(0,DRAW_ARROW,0,1);
   SetIndexStyle(1,DRAW_ARROW,0,1);
   SetIndexArrow(0,159);
   SetIndexArrow(1,159);
   SetIndexBuffer(0,BufU);
   SetIndexBuffer(1,BufD);
   SetIndexDrawBegin(0,Bars-NB);//Индикатор будет отображаться только для NB баров
   SetIndexDrawBegin(1,Bars-NB);
   ArrayInitialize(BufD,0.0);//Забьём оба буфера ноликами. Иначе будет мусор при смене таймфрейма.
   ArrayInitialize(BufU,0.0);
   return(0);
}
//+------------------------------------------------------------------+
//| Функция деинициализации                                          |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+
//| Собсна индикатор                                                 |
//+------------------------------------------------------------------+
int start()
{
   int CB=IndicatorCounted();
   /* Тут вот та самая оптимизационная фишка. В язык введена функция, которая возвращает количество
   посчитанных баров, причём очень хитро. При первом вызове индикатора это 0, всё понятно, ещё ничего
   не считалось, а затем выдаёт количество обсчитанных баров минус один. Т.е. если всего баров 100,
   то функция вернёт 99. Я ввёл такой код, выше у меня определялась NB - кол-во баров подлежащих
   обсчёту. В принципе этот параметр можно и выкинуть, однако для тех кто в танке (I80286) можно
   и оставить. Так вот, здесь, при первом вызове NB остаётся прежней, а при последующих уменьшается
   до последнего бара, т.е. 1 или 2, ну или сколько там осталось посчитать*/
   if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB;
   for (SH=1;SH<NB;SH++)//Прочёсываем график от 1 до NB
   {
      for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);}      R/=55;

      SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)];
      SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)];
      if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufD[SH]=High[SH]+R*0.5; UD=SH_SELL; }
      if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufU[SH]=Low[SH]-R*0.5; UD=SH_BUY; }
   }
   return(0);
}
 

Igor Makanu:

res = NormalizeDouble(MathFloor(MathMin(MathMax(value, MarketInfo(Symbol(),MODE_MINLOT)), MarketInfo(Symbol(),MODE_MAXLOT))/lotStep)*lotStep,lotdigits);


(Quelle tournure. matmax, puis matmin. )

 

où manque la clé d'optimisation ?



comment optimiser ? ??


 

Veuillez m'indiquer comment spécifier correctement la condition d'entrée dans une transaction sur le signal de l'indicateur.


J'ai écrit un conseiller expert simple pour les graphiques Renko qui ressemble à ceci :

extern double LotSize = 0.01;
extern int Magic = 1;

int prevtime = 0;

int start() {
 
   
//При образовании нового кубика ренко проверка на Buy или Sell и заключение ордера
   if (prevtime != Time[0]) {

   if (Close[1] > Open[1]) {
      OrderSend(Symbol(), OP_BUY, LotSize, ND(Ask), 3, 0, 0,  "RG", Magic, 0, Blue);
      }
   if (Close[1] < Open[1]) {
      OrderSend(Symbol(), OP_SELL, LotSize, ND(Bid), 3, 0, 0, "RG", Magic, 0, Red);
      }
      Magic++;
   prevtime = Time[0];
    }
        return(0);
} 

double ND(double np) {
  return(NormalizeDouble(np,Digits));
}


Je ne suis pas très satisfait du graphique hors ligne et j'ai décidé de le combiner avec l'indicateur AG_Renko_Chart. Je le joins à mon message.

Mais voici comment la fonction qui renvoie la valeur renko sur le bord droit :

iCustom(_Symbol,TF,"AG_Renko_Chart",Step,false,false,Revers,0,0);

Je n'arrive pas à trouver comment distinguer une barre descendante ou ascendante... Et comment bien prescrire une fonction qui ne ferait pas beaucoup de métiers....


En général, je n'ai pas les idées claires. Aidez-nous s'il vous plaît !!!!

Dossiers :
 
Roman Shiredchenko:

où manque la clé d'optimisation ?



comment optimiser ? ??


Est-ce une blague ou une blague sociale ???


 
Alexey Viktorov:

C'est une blague ou vous vous moquez de la société ?


Ce n'est pas une blague et ce n'est pas comme ça que je me moque de la société.

Regardez bien l'image avant de publier une hérésie.

 
Roman Shiredchenko:

ce n'est pas une blague et ce n'est pas comme ça que je me moque.

Regardez attentivement l'image avant de publier une hérésie.

Le problème est la résolution de l'écran.