Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 706

 
Терминал просто отбрасывает все лишние знаки.

если с таким объемом открыть:
0.029

то откроет 0.02 лота

а если с таким объемом открыть:

NormalizeDouble(0.029,2)
то откроет 0.03 лота
 
multiplicator:

Как посчитать количество знаков после запятой?

например, я узнал, что минимальный лот 0.01.

как мне теперь вывести, что количество знаков после запятой здесь 2?
чтобы потом нормализовать объем ордера до двух знаков после запятой.

вот кодяра:
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:
Терминал просто отбрасывает все лишние знаки.

если с таким объемом открыть:

то откроет 0.02 лота

а если с таким объемом открыть:

то откроет 0.03 лота

а если нужно открыть 0.25 лота? вот готовые и рабочие ф-ции, читайте пользуйтесь

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


multiplicator:

например мы подставляем в функцию значение: 7 лотов.
у брокера минимальный объем лота 5, и шаг лота 2.

вот можете мою ф-цию нормализации лота проверить, давно пользуюсь, пока никто не жаловался, там как Вы хотите узнаем шаг лота и потом округляем до количества знаков шага лота

//_______________________________________________________________________
//Нормализация объема лота для ордера 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);}
//_______________________________________________________________________
ну а если нашли сервер у которого шаг лота, например 0.37, то тут только сложением и сравнением до требуемого лота в цикле, но не было таких серверов, вроде на биткоине есть не стандартные лоты, не занимался, не в курсе, нужна конкретная ситуация
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Добрый день многоуважаемые коллеги, помогите пожалуйста правильно прописать условие в советнике для вхождения в зделку по сигналам индикатора  SHI_silvertrend_signal на бинарных опционах , только OP_SELL и OP_BUY. для M1 и М5. Сигнал поступает при закрытии предыдущей свечи. 


- Открывать ордер в момент сигнала индикатора,  только на первой свече после сигнала

- не дольше 5 секунд от получения сигнала.

- допустимое изменение цены в пределах Slippage



(У индикатора 2 буфера)

из комментария индикатора // оба буфера наполняються ноликами. Иначе будет мусор при смене таймфрейма.

Заранее премного благодарен за вашу помощь и поддержку!

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

      }

   }

}

.......

Код самого индикатора(Найден в интернете, если публикация кода не противоречит правилам форума?)

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


во как закрутили. матмакс, потом матмин. )

 

куда пропала клавиша оптимизация? 



как ОПТИМИЗИРОВАТЬ??? 


 

Здравствуйте уважаемые коллеги! Подскажите пожалуйста как правильно указать условие вхождения в сделку по сигналу индикатора.


Написал простенький советник для графиков Ренко выглядит следующим образом:

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


Меня не очень устраивают офлайн график, по этому решил совместить с вот таким индикатором AG_Renko_Chart. Прилагаю к сообщению.

Но вот как функция которая возвращает значение ренко на правом краю:

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

А как отличить бар в низ или в верх не разберусь... И как правильно прописать функцию что бы не заключала много сделок...


В общем голова уже не соображает. Помогите пожалуста!!!!

Файлы:
 
Roman Shiredchenko:

куда пропала клавиша оптимизация? 



как ОПТИМИЗИРОВАТЬ??? 


Это шутка такая или решил поиздеваться над обществом???


 
Alexey Viktorov:

Это шутка такая или решил поиздеваться над обществом???


это не шутка  и издеваюсь не так.

Внимательно на картинку посмотри, прежде чем ересь постить.

 
Roman Shiredchenko:

это не шутка  и издеваюсь не так.

Внимательно на картинку посмотри, прежде чем ересь постить.

Проблема в разрешении экрана.

Причина обращения: