Заметки по програмированию mql4 от eevviill

Заметки по програмированию mql4 от eevviill

18 февраля 2016, 13:24
eevviill7
[Удален]
0
205

Заметка 1 - сдвиг данных в массиве

Задача. Сдвинуть данные на 1 елемент назад. (6-ой станет 5-ым и т.д.)

ArrayCopy(buf,buf,0,1);

 Сдвинуть на 1 вперёд.

ArrayCopy(buf,buf,1,0);

 

 

Заметка 2 - перебор всех символов в обзоре рынка

uint symbols_tot;
string symbols[]; 

//////////////////////////////////////////////////////////////
int OnInit()
{
symbols_tot=SymbolsTotal(true);
ArrayResize(symbols,symbols_tot);

for(int i=0;i<symbols_tot;i++)
{
  symbols[i]=SymbolName(i,true);
}

 
return(INIT_SUCCEEDED);
}

 
///////////////////////////////////////////////////////////////
void OnTick()
{
for(int i=0;i<symbols_tot;i++)
{
Alert("Symbol:"+symbols[i]);
}

 
}


 

Заметка 3 - преобразование типа переменной

Если вам надо например преобразовать тип переменной с datetime в string, то можно это сделать так

datetime time_cur=TimeCurrent();

Alert(TimeToString(time_cur));

 А можно так

datetime time_cur=TimeCurrent();

Alert(string(time_cur));

 

 

Заметка 4 - открытие ордера(бинарные опционы)

Вся соль в коментарие к ордеру. Нужно записывать так

extern uint expiration_minits = 5;
...
OrderSend(Symbol(),OP_BUY,Lot,Ask,0,0,0,"BO exp:"+string(expiration_minits*60),Magic,0,clrNONE);

 

 

Заметка 5 - поиск цен уровней Фибоначчи

Сами цены уровней узнать нельзя. Только расчитать.

string name_fibo="Fibo";

  int levels=int(ObjectGetInteger(0,name_fibo,OBJPROP_LEVELS));
  double fib_prices[]; ArrayResize(fib_prices,levels);
   double price_lev0=ObjectGetDouble(0,name_fibo,OBJPROP_PRICE,1);
  double price_lev100=ObjectGetDouble(0,name_fibo,OBJPROP_PRICE,0);
  bool wayUP=false; if(price_lev0<price_lev100) wayUP=true;
  double perc100_points=MathAbs(price_lev0-price_lev100);


   double level=0;
   for(int i=0;i<levels;i++)
     {
      level=ObjectGetDouble(0,name_fibo,OBJPROP_LEVELVALUE,i);
      if(wayUP) fib_prices[i]=price_lev0+perc100_points*level;
      else
      fib_prices[i]=price_lev0-perc100_points*level;     
     }

 

 

Заметка 6 - нажатие кнопки

OnChartEvent() в тестере не работает. Но одно универсальное решение для нажатия кнопки в тестере и живой торговли есть.
 if(ObjectGetInteger(0,"BUY_button",OBJPROP_STATE))

{

ObjectSetInteger(0,"BUY_button",OBJPROP_STATE,false);

... 

}


Заметка 7 - обрезание символов в цене инструмента

Подходит только к цене. Если что то другое, то надо вместо Digits писать число которое ровно количеству символов дроби.

extern ushort Characters_delete = 1;

///////////////////////////////////////////
string data=DoubleToString(Bid,Digits); 
string resoult=StringSubstr(data,0,StringLen(data)-Characters_delete);

 

 

Заметка 8 - разделение строки на элементы

Например нам нужно разделить строку с лотами и поместить их в буфер.

extern string Lots="0.01,0.03,0,06";

...
string str_spl[];
int size=StringSplit(Lots,StringGetCharacter(",",0),str_spl);
ArrayResize(lots_buf,size);

for(int i=0;i<size;i++)
{
lots_buf[i]=double(str_spl[i]);
}


 

Заметка 9 - определение первого тика на новой свече(работа раз на баре)

Так и только так надо определять приход нового бара. Многие используют Time[0], но он не будет работать правильно если вы переключите на необновленный график или включите терминал после простоя.

 int prevbars;
...
if(Bars==prevbars) return;
 prevbars=Bars;