Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 706

 
Das Terminal verwirft einfach alle zusätzlichen Zeichen.

Wenn Sie mit diesem Band beginnen:
0.029

es werden 0,02 Lose geöffnet

und wenn sie mit diesem Band geöffnet wird:

NormalizeDouble(0.029,2)
wird er 0,03 Lose öffnen.
 
multiplicator:

Wie berechne ich die Anzahl der Dezimalstellen?

Ich habe zum Beispiel herausgefunden, dass die Mindestmenge 0,01 beträgt.

Wie komme ich zu dem Schluss, dass die Anzahl der Nachkommastellen 2 beträgt?
um das Auftragsvolumen auf zwei Nachkommastellen zu normalisieren.

Hier ist das Codewort:
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:
Das Terminal verwirft einfach alle zusätzlichen Zeichen.

Wenn wir mit diesem Band beginnen:

werden 0,02 Lose geöffnet.

und wenn Sie mit diesem Band öffnen:

wird er 0,03 Lose öffnen.

Und wenn Sie 0,25 Lots öffnen müssen? Hier sind fertige und funktionierende Funktionen, lesen Sie sie und verwenden Sie sie.

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


Multiplikator:

Wir geben z.B. den Wert in die Funktion ein: 7 Lose.
Der Broker hat ein minimales Lotvolumen von 5 und eine Lotabstufung von 2.

hier ist meine Losnormalisierungsfunktion, die ich schon lange verwende und über die sich noch niemand beschwert hat. Dort kann man das Losinkrement herausfinden und dann auf die Anzahl der Stellen des Losinkrements aufrunden.

//_______________________________________________________________________
//Нормализация объема лота для ордера 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);}
//_______________________________________________________________________
Nun, wenn Sie einen Server, der eine Menge Schritt hat, zum Beispiel 0,37 gefunden, dann gibt es nur Addition und Vergleich zu den erforderlichen Menge in der Schleife, aber es gab keine solchen Servern, so scheint es gibt Nicht-Standard-Lose auf bitcoin, nicht beschäftigt, ich weiß nicht, müssen Sie eine bestimmte Situation
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Guten Tag liebe Kollegen, bitte helfen Sie mir richtig schreiben die Bedingung in meinem EA für die Eingabe eines Handels auf SHI_silvertrend_signal Indikator Signale auf binäre Optionen, nur OP_SELL und OP_BUY. für M1 und M5. Das Signal wird am Ende der vorherigen Kerze ausgelöst.


- Um eine Order im Moment des Signals des Indikators zu eröffnen, nur auf der ersten Kerze nach dem Signal

- nicht länger als 5 Sekunden ab dem Zeitpunkt des Signalempfangs.

- Annehmbare Preisänderung innerhalb der Schwankungsbreite



(Der Indikator hat 2 Puffer)

aus dem Indikator-Kommentar// beide Puffer mit Nullen zu füllen. Andernfalls kommt es beim Ändern des Zeitrahmens zu Unstimmigkeiten.

Vielen Dank im Voraus für Ihre Hilfe und Unterstützung!

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("Ошибка открытия ордера на продажу!");

      }

   }

}

.......

Der Code des Indikators selbst (ich habe ihn im Internet gefunden, falls die Veröffentlichung des Codes nicht gegen die Forenregeln verstößt)

//+------------------------------------------------------------------+
//|                                           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);


(Was für eine Wendung: erst matmax, dann matmin. )

 

Wo fehlt der Optimierungsschlüssel?



wie optimiert man???


 

Bitte geben Sie an, wie man die Bedingung für den Einstieg in den Handel mit dem Indikatorsignal korrekt festlegt.


Ich habe einen einfachen Expert Advisor für Renko-Chartsgeschrieben, der wie folgt aussieht:

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));
}


Ich bin mit dem Offline-Chart nicht sehr zufrieden und habe beschlossen, ihn mit dem Indikator AG_Renko_Chart zu kombinieren. Ich füge sie meiner Nachricht bei.

Aber hier ist, wie die Funktion, die den Renko-Wert am rechten Rand zurückgibt:

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

Ich kann nicht herausfinden, wie man zwischen abwärts und aufwärts gerichteten Balken unterscheiden kann... Und wie man eine Funktion richtig vorschreibt, die nicht viele Geschäfte machen würde ...


Im Allgemeinen kann ich nicht mehr klar denken. Hilfe bitte!!!!

Dateien:
 
Roman Shiredchenko:

Wo fehlt der Optimierungsschlüssel?



wie optimiert man???


Ist das ein Scherz oder ein sozialer Scherz???


 
Alexey Viktorov:

Ist das ein Scherz oder machen Sie sich über die Gesellschaft lustig?


Das ist kein Witz, und so mache ich mich nicht über die Gesellschaft lustig.

Schauen Sie sich das Bild genau an, bevor Sie Ketzerei verbreiten.

 
Roman Shiredchenko:

es ist kein Witz und ich mache mich nicht darüber lustig.

Sehen Sie sich das Bild genau an, bevor Sie Ketzerei verbreiten.

Das Problem ist die Bildschirmauflösung.

Grund der Beschwerde: