Jump to content

Общие вопросы по языку MQL


Recommended Posts

Rama

Я столкнулся с проблемкой непонятной для меня)))): пишу советник(собрал вместе несколько индикаторов, при чём не вызываю их посредством іCustom() а прописываю весь код необходимый других индикаторов в своем советнике), откомпилировал - 0 ошибок,0 предупреждений А ЗАПУСКАТЬСЯ НА ГРАФИК НЕ ХОЧЕТ??? (МЕТАТРЕЙДЕР) В ЧЁМ ДЕЛО??? ПОДСКАЖИТЕ)))

Link to post
Share on other sites
  • Replies 7.6k
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    577

  • sergey1294

    569

  • Ugar68

    517

  • Programmer

    419

Top Posters In This Topic

Popular Posts

Ну, в данном случае мне стоило бы сразу соблюдать простейшие приёмы защитного программирования, то есть проверять, не равна ли нулю переменная, оказавшаяся под знаком деления. Ведь она "чужая", то ест

На счёт проверок, это правильно. Я больше очень практикую, то же нарывался. Но в моём случае у меня советник открывал ордер минимальным лотом вместо нормального, когда замечал, доливаться было поздно.

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 су

Posted Images

sergey1294
Я столкнулся с проблемкой непонятной для меня)))): пишу советник(собрал вместе несколько индикаторов, при чём не вызываю их посредством іCustom() а прописываю весь код необходимый других индикаторов в своем советнике), откомпилировал - 0 ошибок,0 предупреждений А ЗАПУСКАТЬСЯ НА ГРАФИК НЕ ХОЧЕТ??? (МЕТАТРЕЙДЕР) В ЧЁМ ДЕЛО??? ПОДСКАЖИТЕ)))

а кто его знает в чем дело, выкладывайте свой код, без него ни как не разобраться что вы там понаписали.

Link to post
Share on other sites
tyro

Уважаемые программисты,

подскажите пожалуйста почему не выполняются операторы когда условие истино, точнее выполняются но в беспорядочном режиме (например, через раз). В логах ошибок нет.

 

 

extern int first_p_TS_DIST=20;

Print("ord_open="+ord_open);
Print("First_sell_limit_TP="+First_sell_limit_TP*Point);
Print("first_p_TS_DIST="+first_p_TS_DIST*Point);
Print("MODE_SPREAD="+MarketInfo(Symbol(),MODE_SPREAD)*Point);         
Print("Bid="+Bid+" Ask="+Ask);
Print("Перенос СЛ, Если ord_sl==ord_open+First_sell_limit_SL "+ord_sl+"="+(ord_open+First_sell_limit_SL*Point)+" Ask<"+ord_open+"-"+First_sell_limit_TP*Point+"+"+first_p_TS_DIST*Point+"+"+MarketInfo(Symbol(),MODE_SPREAD)*Point+" "+Ask+"<"+(ord_open-First_sell_limit_TP*Point+first_p_TS_DIST*Point+MarketInfo(Symbol(),MODE_SPREAD)*Point)+" first_p_TS_DIST>STOPLEVEL "+first_p_TS_DIST*Point+">"+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point);

ЛОГ: 
ord_open=1.44433000
First_sell_limit_TP=0.00200000
first_p_TS_DIST=0.00020000
MODE_SPREAD=0.00013000
Bid=1.44252000 Ask=1.44265000
Перенос СЛ, Если ord_sl==ord_open+First_sell_limit_SL(1.44933000=1.44933000) Ask<1.44433000-0.00200000+0.00020000+0.00013000 (1.44265000<1.44266000) first_p_TS_DIST>STOPLEVEL (0.00020000>0.00018000)
                                                               ^ 1-ое условие                                                          ^ 2-ое условие                                    ^ 3-е условие

if (ord_sl==ord_open+First_sell_limit_SL*Point && Ask<(ord_open-First_sell_limit_TP*Point+first_p_TS_DIST*Point+MarketInfo(Symbol(),MODE_SPREAD)*Point) && first_p_TS_DIST*Point>MarketInfo(Symbol(),MODE_STOPLEVEL)*Point) //первый перенос СЛ
        {
           Print("Модификация SL, попытка установить новый СЛ");        
        }

 

Т.е. сейчас условие истино, но оператор Print не выполняется, первый раз такая проблема..., нормализация так же не помогла... :search:

Edited by tyro
Link to post
Share on other sites
Аднер

подскажите пожалуйста как узнать тикет последнего закрытого ордера определённого магика?

Link to post
Share on other sites
Аднер

С помощью функции OrdersHistoryTotal я так понимаю можно узнать только общее количество закрытых и удалённых ордеров на текущем счёте? или как то всё таки можно узнасть кол-во сделок опред. магика? и как узнать тикет именно последнего закрытого ордера, именно по указанному магику? а то тут какойто замкнутый круг получается , то есть для того чтобы получить тикет , надо сначало выбрать этот ордер , а что бы его выбрать нужно знать тикет..... (покажите пожалуйста пример)

Link to post
Share on other sites
sergey1294
С помощью функции OrdersHistoryTotal я так понимаю можно узнать только общее количество закрытых и удалённых ордеров на текущем счёте? или как то всё таки можно узнасть кол-во сделок опред. магика? и как узнать тикет именно последнего закрытого ордера, именно по указанному магику? а то тут какойто замкнутый круг получается , то есть для того чтобы получить тикет , надо сначало выбрать этот ордер , а что бы его выбрать нужно знать тикет..... (покажите пожалуйста пример)

for(int i=0;i<OrdersHistoryTotal();i++)
  {
   if(OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
   {
    if (OrderMagicNumber()==Magic)
    {
     tiket=OrderTicket();
    }
   }

Link to post
Share on other sites
Ugar68
С помощью функции OrdersHistoryTotal я так понимаю можно узнать только общее количество закрытых и удалённых ордеров на текущем счёте? или как то всё таки можно узнасть кол-во сделок опред. магика? и как узнать тикет именно последнего закрытого ордера, именно по указанному магику? а то тут какойто замкнутый круг получается , то есть для того чтобы получить тикет , надо сначало выбрать этот ордер , а что бы его выбрать нужно знать тикет..... (покажите пожалуйста пример)

 

Что бы выбрать ордер не обязательно знать тикет. Можно выбирать по номеру.

Например так:

//=================================================================================
//Функция находит последний исторический ордер и возвращает его тикет. Если не находит 
//исторических ордеров возвращает -1
/*
symb - символ, All- все символы
mag - маджик номер, -1 -любой
*/
int LastHistotyOrder(string symb, int mag)
  {
  datetime opentime=0;
  int ticket=-1;
  int hist=OrdersHistoryTotal();
  for(int p=hist-1; p>=0; p--)
     {
     if(!OrderSelect(p, SELECT_BY_POS, MODE_HISTORY))
        {
        Print("Ордер не выбрат, ошибка = ",GetLastError());
        }
     if(symb!="All" && OrderSymbol()!=Symbol())continue;
     if(mag>=0 && OrderMagicNumber()!=mag)continue;
     if(opentime<OrderCloseTime())
        {
        opentime=OrderCloseTime();
        ticket=OrderTicket();
        }
     }
  return(ticket);
  }


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Аднер

int LastHistotyOrder(string symb, int mag); почему ругается на эту строчку?

Link to post
Share on other sites
Ugar68
int LastHistotyOrder(string symb, int mag); почему ругается на эту строчку?

Приведённый выше год это пользовательская функуия. Её надо разместить за пределами функций stsrt(), init(), deinit().

А уже в своём годе вызвать функцию для получения тикета. Что ей скормить, при вызове прописано в коментарии кода функции.

Например:

int start()

{

//----

int tickethist=LastHistotyOrder(Symbol(),Magic);

//----

return(0);

}

Далее приведённая выше функция. В итоге в переменной tickethist будет тикет последнего закрытого ордера или -1 если в истории нет ордеров с этим символом и маджиком.

Edited by Ugar68

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
tyro
Уважаемые программисты,

подскажите пожалуйста почему не выполняются операторы когда условие истино, точнее выполняются но в беспорядочном режиме (например, через раз). В логах ошибок нет.

 

... :search:

 

Всем кто хотел помочь, но не успел - спасибо, уже разобрался :).

Link to post
Share on other sites
Аднер

большое спасибо Вам за разьяснение, но я тут подумал и решил сделать так ,код ставится в функцию stsrt() должно работать поправьте пожалуйста если где не так

int opentime=0;
 int ticket;
 int hist=OrdersHistoryTotal();
  for(int p=hist-1; p>=0; p--)
   {  
    if(OrderSelect(p,SELECT_BY_POS,MODE_HISTORY)==true)
    //if(symb!="All" && OrderSymbol()!=Symbol())continue; строка не очень нужна но пригодится
    if(MG>=0 && OrderMagicNumber()!=MG)continue;
    if(opentime<OrderCloseTime())
        {
        //opentime=OrderCloseTime();и помоему эта строчка не очень нужна
        ticket=OrderTicket();
        }
    if(OrderSelect(p,SELECT_BY_POS,MODE_HISTORY)==false)
        {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        ticket=-1;
        break;
        }
   }

Edited by Аднер
Link to post
Share on other sites
Programmer
большое спасибо Вам за разьяснение, но я тут подумал и решил сделать так ,код ставится в функцию stsrt() должно работать поправьте пожалуйста если где не так

 

Приветствую.

Необходимо ещё скобки добавить посли выбора ордера:

 

int opentime=0;

int ticket;

int hist=OrdersHistoryTotal();

for(int p=hist-1; p>=0; p--)

{

if(OrderSelect(p,SELECT_BY_POS,MODE_HISTORY)==true)

{ //тут *******

//if(symb!="All" && OrderSymbol()!=Symbol())continue; строка не очень нужна но пригодится

if(MG>=0 && OrderMagicNumber()!=MG)continue;

if(opentime<OrderCloseTime())

{

//opentime=OrderCloseTime();и помоему эта строчка не очень нужна

ticket=OrderTicket();

}

} //и тут *******

if(OrderSelect(p,SELECT_BY_POS,MODE_HISTORY)==false)

{

Print("Ошибка при доступе к исторической базе (",GetLastError(),")");

ticket=-1;

break;

}

}

Link to post
Share on other sites
Programmer
большое спасибо Вам за разьяснение, но я тут подумал и решил сделать так ,код ставится в функцию stsrt() должно работать поправьте пожалуйста если где не так

 

Приветствую.

Необходимо ещё скобки добавить посли выбора ордера:

 

int opentime=0;
 int ticket;
 int hist=OrdersHistoryTotal();
  for(int p=hist-1; p>=0; p--)
   {  
    if(OrderSelect(p,SELECT_BY_POS,MODE_HISTORY)==true)
    { //тут *******
       //if(symb!="All" && OrderSymbol()!=Symbol())continue; строка не очень нужна но пригодится
       if(MG>=0 && OrderMagicNumber()!=MG)continue;
       if(opentime<OrderCloseTime())
           {
           //opentime=OrderCloseTime();и помоему эта строчка не очень нужна
           ticket=OrderTicket();
           }
    } //и тут *******
    if(OrderSelect(p,SELECT_BY_POS,MODE_HISTORY)==false)
        {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        ticket=-1;
        break;
        }
   }

Link to post
Share on other sites
Лесной

Подскажите в каком месте кода в индикаторе Slope Line :

//+------------------------------------------------------------------+

//| HMA.mq4

//| Copyright © 2006 WizardSerg <[email protected]>, ?? ??????? ForexMagazine #104

//| [email protected]

//| Revised by IgorAD,[email protected] |

//| Personalized by iGoR AKA FXiGoR for the Trend Slope Trading method (T_S_T)

//| Link:

//| contact: [email protected]

//+------------------------------------------------------------------+

#property copyright "MT4 release WizardSerg <[email protected]>, ?? ??????? ForexMagazine #104"

#property link "[email protected]"

#property indicator_chart_window

#property indicator_buffers 2

#property indicator_color1 LightBlue

#property indicator_color2 Tomato

//---- input parameters

extern int period=80;

extern int method=3; // MODE_SMA

extern int price=0; // PRICE_CLOSE

//---- buffers

double Uptrend[];

double Dntrend[];

double ExtMapBuffer[];

 

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

IndicatorBuffers(3);

SetIndexBuffer(0, Uptrend);

//ArraySetAsSeries(Uptrend, true);

SetIndexBuffer(1, Dntrend);

//ArraySetAsSeries(Dntrend, true);

SetIndexBuffer(2, ExtMapBuffer);

ArraySetAsSeries(ExtMapBuffer, true);

 

SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);

SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);

 

IndicatorShortName("Slope Direction Line("+period+")");

return(0);

}

//+------------------------------------------------------------------+

//| Custor indicator deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

// ???? ????? ?????? ??????

return(0);

}

//+------------------------------------------------------------------+

//| ?????????? ??????? |

//+------------------------------------------------------------------+

double WMA(int x, int p)

{

return(iMA(NULL, 0, p, 0, method, price, x));

}

//+------------------------------------------------------------------+

//| Custom indicator iteration function |

//+------------------------------------------------------------------+

int start()

{

int counted_bars = IndicatorCounted();

 

if(counted_bars < 0)

return(-1);

 

int x = 0;

int p = MathSqrt(period);

int e = Bars - counted_bars + period + 1;

 

double vect[], trend[];

 

if(e > Bars)

e = Bars;

ArrayResize(vect, e);

ArraySetAsSeries(vect, true);

ArrayResize(trend, e);

ArraySetAsSeries(trend, true);

 

for(x = 0; x < e; x++)

{

vect[x] = 2*WMA(x, period/2) - WMA(x, period);

// Print("Bar date/time: ", TimeToStr(Time[x]), " close: ", Close[x], " vect[", x, "] = ", vect[x], " 2*WMA(p/2) = ", 2*WMA(x, period/2), " WMA(p) = ", WMA(x, period));

}

for(x = 0; x < e-period; x++)

 

ExtMapBuffer[x] = iMAOnArray(vect, 0, p, 0, method, x);

 

for(x = e-period; x >= 0; x--)

{

trend[x] = trend[x+1];

if (ExtMapBuffer[x]> ExtMapBuffer[x+1]) trend[x] =1;

if (ExtMapBuffer[x]< ExtMapBuffer[x+1]) trend[x] =-1;

 

if (trend[x]>0)

{ Uptrend[x] = ExtMapBuffer[x];

if (trend[x+1]<0) Uptrend[x+1]=ExtMapBuffer[x+1];

Dntrend[x] = EMPTY_VALUE;

 

}

else

if (trend[x]<0)

{

Dntrend[x] = ExtMapBuffer[x];

if (trend[x+1]>0) Dntrend[x+1]=ExtMapBuffer[x+1];

Uptrend[x] = EMPTY_VALUE;

}

 

//Print( " trend=",trend[x]);

}

 

return(0);

}

//+------------------------------------------------------------------+

происходит смена цвета скользящей средней с LightBlue на Tomato и наоборот...

Хочу туда строки торговли закинуть,советник получить,а куда вставить не пойму...

Link to post
Share on other sites
Rubinovi4
Подскажите в каком месте кода в индикаторе Slope Line :

 

происходит смена цвета скользящей средней с LightBlue на Tomato и наоборот...

Хочу туда строки торговли закинуть,советник получить,а куда вставить не пойму...

Не будет он торговать, ответ, несколькими страницами раниее. В ветке есть советник на слопе, ищите да обрящите.. :gigi:

Link to post
Share on other sites
Лесной

Не будет он торговать, ответ, несколькими страницами раниее. В ветке есть советник на слопе, ищите да обрящите.. :gigi:

Угу... Спасибо... Разобрался и нашёл что нужно было...

Link to post
Share on other sites
Voldemar227

скажите плиз как сюда добавить трейлинг стоп ???

 

 

double slb,tpb,sls,tps; //Вводим переменные для стоп лоссов и тейк профита//

if(OrdersTotal()==0) //Функция провепяет наличие ордеров//

{ // //

if((Close[0]<=nizB)&&(S1>S2)&&(S1<StohMin)&&(S2<StohMin)&&(R<RsiMin)) // Сравниваем индикаторы //

{ // //

slb=NormalizeDouble(Bid - (Loss*Point),Digits); //расчёт стопа для бай позиций//

tpb=NormalizeDouble(Ask + (Profit*Point),Digits); //расчёт профита для бай позиций//////////

tick=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),Slip,slb,tpb,NULL,MagicNumber,0,CLR_NONE);//Вход на бай//

if(tick<0) Print("Ошибка № - ",GetLastError()); //пишет ошибку//

} // //

else //нет позиции на бай тогда ищем на селл//

if((Close[0]>=verhB)&&(S1<S2)&&(S1>StohMax)&&(S2>StohMin)&&(R>RsiMax)) //Сравниваем индикаторы//

{ // //

sls=NormalizeDouble(Ask + (Loss*Point),Digits); //расчёт стопа для селл позиций//

tps=NormalizeDouble(Bid - (Profit*Point),Digits); //расчёт профита для селл позиций//

tick2=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),Slip,sls,tps,NULL,MagicNumber,0,CLR_NONE);//Вход сел //

if(tick2<0) Print("Ошибка № - ",GetLastError()); //пишет ошибку//

} // //

} // //

return(0);}


Трейдер и программист ...     Мой блог     Мой профиль

Link to post
Share on other sites
-Алексей-
скажите плиз как сюда добавить трейлинг стоп ???

 

Если имеется в виду трейлинг стоп из МТ4 то никак.

Для этого нужно писать функцию или взять готовую, из любого експерта в этой ветке и установить условие по которому будет вызываться эта функция.

Наппример

если (профит > Х)

Вызвать ф-ию трейлинг.

Возьми для примера советник Дум-дум. Может и другие есть но зтот я смотрел досканально. Он не очень сложный (в чебурашке по непроверенным данным 7000 строк.) и написан профессионалом. Разберись в этом коде и многие вопросы отпадут.

Edited by -Алексей-
Link to post
Share on other sites
Voldemar227

Как сделать так что бы ордер откладывался на заданное колличество пунктов от Болинжера от верхней и нижней линии

 

if((verhB-nizB)<=Raznica)

 

 

// Сравниваем индикаторы // //Сравниваем индикаторы//

tick=OrderSend(Symbol(),4,Lots,NormalizeDouble(Ask+Delta*Point,Digits),Slip,slb,tpb,NULL,MagicNumber,0,CLR_NONE); //Вход на бай//

if(tick<0) Print("Ошибка № - ",GetLastError());

//пишет ошибку//

tick2=OrderSend(Symbol(),5,Lots,NormalizeDouble(Bid-Delta*Point,Digits),Slip,sls,tps,NULL,MagicNumber,0,CLR_NONE); //Вход сел //

if(tick2<0) Print("Ошибка № - ",GetLastError()); //пишет ошибку//

} // //

} // //

return(0);}


Трейдер и программист ...     Мой блог     Мой профиль

Link to post
Share on other sites
Voldemar227

Выложите плиз сюда кусок кода с трейлинг стопом .

С пояснением для начинающего чайника!!!


Трейдер и программист ...     Мой блог     Мой профиль

Link to post
Share on other sites
Rubinovi4

Пора брать за обучение....

Link to post
Share on other sites
sergey1294
Выложите плиз сюда кусок кода с трейлинг стопом .

С пояснением для начинающего чайника!!!

зайди сюда, там найдешь еще много чего полезного

https://alpariforum.com/thread47476.html

Link to post
Share on other sites
GopherZ

Добрый день. Осваиваю программирования на MQL и возник такой вопрос...

Допустим алгоритм советника примерно следующий:

-оценить вчерашний день

-Выставить один ордер, в соответствии стратегии его модифицировать и по прибыли закрыть

-В конце дня ордер,если не был закрыт ранее, закрывается по рыночной цене, либо если он не вступил в силу - удаляется

 

И так же на следующий день...

 

Вопрос в следующем:

Если происходит обрыв интернета/выключили свет в течении дня...

То как себя поведет советник?

Надо ли специально добавить код для анализа текущей ситуации? (открытые ордера и т.п.) Чтобы советник понял на какой стадии алгоритма он находится...

 

Спасибо

Link to post
Share on other sites
Ugar68
Вопрос в следующем:

Если происходит обрыв интернета/выключили свет в течении дня...

То как себя поведет советник?

Надо ли специально добавить код для анализа текущей ситуации? (открытые ордера и т.п.) Чтобы советник понял на какой стадии алгоритма он находится...

 

Спасибо

 

Если советник пишется для тестера то не надо. Если же для реальной работы то обязательно надо учитывать всё что может произойти в реальном мире и не только разрыв связи.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...