Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 706

 
Il terminale scarta semplicemente tutti i caratteri extra.

Se si apre con questo volume:
0.029

aprirà 0,02 lotti

e se si apre con quel volume:

NormalizeDouble(0.029,2)
aprirà 0,03 lotti.
 
multiplicator:

Come si calcola il numero di cifre decimali?

Per esempio, ho scoperto che il lotto minimo è 0,01.

come faccio a dedurre che il numero di cifre decimali è 2?
per normalizzare il volume dell'ordine con due cifre decimali.

ecco la parola d'ordine:
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:
Il terminale scarta semplicemente tutti i segni extra.

Se apriamo con questo volume:

aprirà 0,02 lotti.

e se si apre con quel volume:

aprirà 0,03 lotti.

E se avete bisogno di aprire 0,25 lotti, ecco le funzioni pronte e funzionanti, leggetele e usatele.

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


moltiplicatore:

Ad esempio, mettiamo il valore nella funzione: 7 lotti.
Il broker ha un volume di lotto minimo di 5 e un incremento di lotto di 2.

Ecco la mia funzione f di normalizzazione dei lotti, la uso da molto tempo, nessuno si è ancora lamentato, lì potete trovare l'incremento del lotto e poi arrotondarlo al numero di cifre dell'incremento del lotto

//_______________________________________________________________________
//Нормализация объема лота для ордера 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);}
//_______________________________________________________________________
Beh, se avete trovato un server che ha un passo di lotto, per esempio, 0,37, poi c'è solo l'aggiunta e il confronto con il lotto richiesto nel ciclo, ma non ci sono stati tali server, sembra che ci sono lotti non standard su bitcoin, non impegnati, non so, è necessario una situazione specifica
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Buon giorno cari colleghi, per favore aiutatemi a scrivere correttamente la condizione nel mio EA per entrare in un trade sui segnali dell'indicatore SHI_silvertrend_signal sulle opzioni binarie, solo OP_SELL e OP_BUY. per M1 e M5. Il segnale arriva alla chiusura della candela precedente.


- Per aprire un ordine al momento del segnale dell'indicatore, solo sulla prima candela dopo il segnale

- non più di 5 secondi dal momento della ricezione del segnale.

- Variazione di prezzo ammissibile all'interno dello Slippage



(L'indicatore ha 2 buffer)

dal commento dell'indicatore// entrambi i buffer da riempire con degli zeri. Altrimenti ci sarà della spazzatura quando si cambia l'orario.

Grazie in anticipo per il vostro aiuto e supporto!

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

      }

   }

}

.......

Il codice dell'indicatore stesso (trovato su Internet, se la pubblicazione del codice non contraddice le regole del 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);


(Che colpo di scena: matmax, poi matmin. )

 

dove manca la chiave di ottimizzazione?



come ottimizzare?


 

Si prega di consigliare come specificare correttamente la condizione per entrare in un trade sul segnale dell'indicatore.


Ho scritto un semplice Expert Advisor per i grafici Renko che assomiglia a questo:

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


Non sono molto soddisfatto del grafico offline e ho deciso di combinarlo con l'indicatore AG_Renko_Chart. Lo allego al mio messaggio.

Ma ecco come la funzione che restituisce il valore renko sul bordo destro:

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

Non riesco a capire come distinguere tra barra verso il basso o verso l'alto... E come prescrivere correttamente una funzione che non farebbe un sacco di mestieri ...


In generale, la mia testa non pensa bene. Aiuto per favore!!!!

File:
 
Roman Shiredchenko:

dove manca la chiave di ottimizzazione?



come ottimizzare?


È uno scherzo o uno scherzo sociale?


 
Alexey Viktorov:

È uno scherzo o ti stai prendendo gioco della società?


Non è uno scherzo e non è così che mi prendo gioco della società.

Guardate bene la foto prima di postare un'eresia.

 
Roman Shiredchenko:

Non è uno scherzo e non è il mio modo di prendere in giro.

Guardate attentamente l'immagine prima di postare un'eresia.

Il problema è la risoluzione dello schermo.