Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 706

 
El terminal simplemente descarta todos los caracteres extra.

Si abres con este volumen:
0.029

abrirá 0,02 lotes

y si se abre con ese volumen:

NormalizeDouble(0.029,2)
abrirá 0,03 lotes.
 
multiplicator:

¿Cómo se calcula el número de decimales?

Por ejemplo, he descubierto que el lote mínimo es de 0,01.

¿cómo deduzco que el número de decimales es 2?
para normalizar el volumen de pedidos con dos decimales.

aquí está la palabra clave:
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:
El terminal simplemente descarta todos los signos adicionales.

Si abrimos con este volumen:

abrirá 0,02 lotes.

y si abres con ese volumen:

abrirá 0,03 lotes.

¿Y si necesita abrir lotes de 0,25? Aquí hay funciones listas y en funcionamiento, léalas y utilícelas.

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


multiplicador:

Por ejemplo, ponemos el valor en la función: 7 lotes.
El broker tiene un volumen de lote mínimo de 5 y un paso de lote de 2.

aquí está mi función f de normalización de lotes, la he estado usando durante mucho tiempo, nadie se ha quejado todavía, ahí puedes encontrar el incremento del lote y luego redondearlo al número de dígitos del incremento del lote

//_______________________________________________________________________
//Нормализация объема лота для ордера 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);}
//_______________________________________________________________________
Bueno, si usted encontró un servidor que tiene un paso de lote, por ejemplo, 0,37, entonces no es sólo la adición y la comparación con el lote requerido en el bucle, pero no había este tipo de servidores, parece que hay lotes no estándar en bitcoin, no se dedica, no sé, se necesita una situación específica
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Buen día queridos colegas, por favor ayúdenme a deletrear correctamente la condición en mi EA para entrar en una operación en las señales del indicador SHI_silvertrend_signal en opciones binarias, sólo OP_SELL y OP_BUY. para M1 y M5. La señal llega al cierre de la vela anterior.


- Para abrir una orden en el momento de la señal del indicador, sólo en la primera vela después de la señal

- no más de 5 segundos desde el momento en que se recibe la señal.

- Variación de precios aceptable dentro del deslizamiento



(El indicador tiene 2 topes)

del comentario del indicador// ambos búferes se llenarán de ceros. De lo contrario, habrá basura al cambiar de marco temporal.

Gracias de antemano por su ayuda y apoyo.

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

      }

   }

}

.......

El código del propio indicador (Encontrado en Internet, si publicar el código no contradice las normas del foro...)

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


(Qué giro. matmax, luego matmin. )

 

¿dónde está la clave de optimización que falta?



¿cómo optimizar?


 

Por favor, indique cómo especificar correctamente la condición para entrar en una operación en la señal del indicador.


Escribí un simple Asesor Experto para los gráficos Renko que se parece a esto:

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


No estoy muy contento con el gráfico offline y he decidido combinarlo con el indicador AG_Renko_Chart. Lo adjunto a mi mensaje.

Pero aquí es como la función que devuelve el valor de renko en el borde derecho:

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

No consigo distinguir entre barra descendente o ascendente... Y cómo prescribir adecuadamente una función que no haría un montón de oficios ...


En general, mi cabeza no piensa bien. ¡¡¡¡Ayuda por favor!!!!

Archivos adjuntos:
 
Roman Shiredchenko:

¿dónde está la clave de optimización que falta?



¿cómo optimizar?


¿Es una broma o un chiste social?


 
Alexey Viktorov:

¿Es una broma o se está burlando de la sociedad?


No es una broma y no es así como me burlo de la sociedad.

Mira bien la foto antes de publicar una herejía.

 
Roman Shiredchenko:

no es una broma y no es así como me burlo.

Mira bien la foto antes de publicar una herejía.

El problema es la resolución de la pantalla.

Razón de la queja: