Jump to content
RickD

MQL-4: некоторые полезные функции

Recommended Posts

Igonter

А вот еще маленькая хитрость. Если хочется визуально оценить реальное изменение эквити советника при тесте, достаточно добавить в текст такой фрагмент:

 
if (IsOrder==true && PrevHour!=Hour())
{
  PrevHour=Hour();
  for (cnt=0;cnt<total;cnt++)
  {
  OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit()+1000,0,Red);
    OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit()-1000,0,Red);
  }  
}

И вот что получится, ДО и ПОСЛЕ:

post-15106-1404210160,817_thumb.gif

post-15106-1404210160,867_thumb.gif

Share this post


Link to post
Share on other sites
AlexSilver
:roll:

 

Теоретически можно, но реально не так оказыватся просто к сожалению :roll: А в реальности вполне можно запустить МТ на сервере и пусть себе пишет, так ведь на Виаке и сделано :).

 

Нет, на виаке несколько иначе.

Это, согласен, не просто, но только такой подход будет кардинальным решением вопроса и для всех и на все времена ;)

В общем, странно, что в MQ так и не сделали подобной функции - поскольку им это было бы сделать проще всего. Ну, да ладно... Это так - мысли вслух... Может, кто-то когда-то и осилит эту задачку ;)

 

RickD & Rosh

 

Спасибо наваял вот такого экспера, вроде пишет нормально :)

 

//+------------------------------------------------------------------+
//| выполняется один раз при появлении нового бара                   |
//+------------------------------------------------------------------+

 

Аналогичную ошибку я делал при создании подобного эксперта в МТ-3. Не записывает последнее значение перед выходными, т.к. нет нового бара.

Как я там решил этот вопрос уже не помню - надо поднять эксперт и посмотреть алгоритм.


alexsilver

Учу великому, доброму, вечному!.. 

Share this post


Link to post
Share on other sites
Rosh

У тебя есть двое суток, чтобы вручную записать это значение в файл. ;)

Share this post


Link to post
Share on other sites
AlexSilver
У тебя есть двое суток, чтобы вручную записать это значение в файл. ;)

 

:grin: =D>


alexsilver

Учу великому, доброму, вечному!.. 

Share this post


Link to post
Share on other sites
RickD
А вот еще маленькая хитрость. Если хочется визуально оценить реальное изменение эквити советника при тесте, достаточно добавить в текст такой фрагмент:

 
if (IsOrder==true && PrevHour!=Hour())
{
  PrevHour=Hour();
  for (cnt=0;cnt<total;cnt++)
  {
  OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit()+1000,0,Red);
    OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit()-1000,0,Red);
  }  
}

И вот что получится, ДО и ПОСЛЕ:

 

Все непоняли, но промолчали. Я решил спросить. :)


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
Igonter
Все непоняли, но промолчали. Я решил спросить. :)
А в чем вопрос-то? :roll:

Share this post


Link to post
Share on other sites
RickD
А вот еще маленькая хитрость. Если хочется визуально оценить реальное изменение эквити советника при тесте, достаточно добавить в текст такой фрагмент:

 

Что есть реальное изменение эквити советника? :)


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
Igonter

Прикол в том, что тестер хоть и имеет график эквити ("Средства"), но данные на график выдает в только "контрольных точках", соответствующих совершению каких-то действий советником. А хочется видеть прям в тестере картинку, похожую на виаковский мониторинг.

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

На иллюстрациях вроде видно, что получится...

Share this post


Link to post
Share on other sites
RickD
Для этого нужно каждый час (или сколько надо) делать липовую операцию, перетаскивать туда-сюда тейкпрофит, к примеру. На иллюстрациях вроде видно, что получится...

 

Tnx! :smt045


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
RickD

Как определить предыдущий ордер SELL или BUY

 

Можно так:

 

datetime LastBuyTm = GetLastOrderOpenTime(OP_BUY);
datetime LastSellTm = GetLastOrderOpenTime(OP_SELL);
// LastBuyTm > LastSellTm: последним был BUY ордер
// LastSellTm > LastBuyTm: последним был SELL ордер

datetime GetLastOrderOpenTime(int type) 
{
 datetime tm = -1;

 int cnt = OrdersTotal();
 for (int i=0; i<cnt; i++) {
   if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

   //Опционально
   if (OrderSymbol() != Symbol()) continue;
   if (OrderMagicNumber() != Magic) continue;

   if (OrderType() != type) continue;

   tm = MathMax(tm, OrderOpenTime());
 }

 cnt = HistoryTotal();
 for (i=0; i<cnt; i++) {
   if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

   //Опционально
   if (OrderSymbol() != Symbol()) continue;
   if (OrderMagicNumber() != Magic) continue;

   if (OrderType() != type) continue;

   tm = MathMax(tm, OrderOpenTime());
 }

 return (tm);
}


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
Юг

где тут ошибка :roll:

 

По идее такая функция должна отправлять файл на ftp каждые 10 минут на 9-ой минуте (9,19,29,....59), но реально этого не происходит - фал отправляется каждую минуту

 

     if ( (TimeMinute(Time[0]) + 1)/10 == MathRound( (TimeMinute(Time[0])+1)/10)) 
        {
           SendFTP("data.txt");
        }


С уважением, Юг

Обсуждаем...

ФА...

Share this post


Link to post
Share on other sites
Rosh

Деление int на int само по себе является округлением, поэтому условие всегда будет выполняться :)

 

ЗЫ Может просто проверять на равенство девяти?

Share this post


Link to post
Share on other sites
Юг
Деление int на int само по себе является округлением, поэтому условие всегда будет выполняться :)

 

ЗЫ Может просто проверять на равенство девяти?

 

вот блин, а я чайник полдня мучаюсь :roll:

 

как проверять на 9-ую минуту я честно говоря не придумал :)

 

Е если добавить впереди

 

 
double time=(TimeMinute(Time[0]) + 1);

     if ( time/10 == MathRound(time/10)) 
        {
           SendFTP("data.txt");
        }

 

поможет?

 

P.S.: помогло, теперь обновляет как нужно :)


С уважением, Юг

Обсуждаем...

ФА...

Share this post


Link to post
Share on other sites
Rosh

if(TimeMinute(Time[0])==9)

Share this post


Link to post
Share on other sites
RickD
if(TimeMinute(Time[0])==9)

 

Спартанец пришел послом к македонскому царю. "Ты один?" - удивился царь, привыкший к пышным и многолюдным посольствам. "К одному", - ответил спартанец.

Македонский царь послал сказать спартанцам: "Если я вступлю в Пелопоннес, Спарта будет уничтожена". Спартанцы ответили одним словом: "Если!"

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


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
Igonter

...там, в Спарте, появились первые падонки...

Share this post


Link to post
Share on other sites
RickD

Способ программного закрытия терминала.

Как посоветовал Dedushka, это как раз то, что нужно при маржин колле. :roll:

 

#include <WinUser32.mqh>

int start() {
 int hwnd = WindowHandle(Symbol(), Period());
 int hwnd_parent = 0;

 while(!IsStopped()) {
   hwnd = GetParent(hwnd);
   if (hwnd == 0) break;
   hwnd_parent = hwnd;
 }

 if (hwnd_parent != 0)
   PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);

 return (0);
}


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
RickD

Очень полезная функция split и примеры ее использования.

 

split - разделяет элементы строки и возвращает их в виде массива.

 

Параметры:

[OUT] string& arr[] - возвращаемый массив строк.
[iN] string str - входная строка.
[iN] string sym - разделитель.

 

Пример:

 string text = "1; 2; 3; 4; 5";
 string dig[];
 split(dig, text, ";");

//Теперь массив dig будет содержать 5 элементов:  "1", "2", "3", "4", "5".

 

 

void split(string& arr[], string str, string sym) 
{
 ArrayResize(arr, 0);

 string item;
 int pos, size;

 int len = StringLen(str);
 for (int i=0; i < len;) {
   pos = StringFind(str, sym, i);
   if (pos == -1) pos = len;

   item = StringSubstr(str, i, pos-i);
   item = StringTrimLeft(item);
   item = StringTrimRight(item);

   size = ArraySize(arr);
   ArrayResize(arr, size+1);
   arr[size] = item;

   i = pos+1;
 }
}


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
RickD

Теперь более полезный пример.

Предположим советник должен открывать позицию в указанный промежуток времени. Этот промежуток удобно записать в следующем виде: "12:00-12:03".

Далее - таких временных интервалов может быть несколько. Удобно будет записать их в виде одной строки-параметра: "12:00-12:03; 13:00-13:05; 15:20-15:21".

Это дает нам возможность как указывать неограниченное количество временных интервалов, так и ни одного.

Код для постановки позиции будем следующим:

 

 extern string OpenTime = "10:00-10:05; 12:20-12:31; 13:40-13:55";

 string OTA[];
 string OTI[];
 split(OTA, OpenTime, ";");

 datetime tm0 = CurTime();
 datetime tm1, tm2;

 bool cond = false;

 int cnt = ArraySize(OTA);
 for (int i=0; i < cnt; i++) {
   split(OTI, OTA[i], "-");
   if (ArraySize(OTI) != 2) continue;

   tm1 = StrToTime(TimeToStr(CurTime(), TIME_DATE) + " " + OTI[0]);
   tm2 = StrToTime(TimeToStr(CurTime(), TIME_DATE) + " " + OTI[1]);

//    Print (OTI[0], " *** " ,OTI[1]);

   cond = cond || (tm1 <= tm0 && tm0 < tm2);
 }


 if (cond)
 {
   //Открываем позицию либо выполняем иные действия.
 }


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
mandor

Некоторые бесполезные функции ... :smt002

В торговом плане конечно, не в плане мастерства программирования.


По настоящему человек раскрывается только на операционном столе © Херург

Share this post


Link to post
Share on other sites
RickD
Некоторые бесполезные функции ... :smt002

В торговом плане конечно, не в плане мастерства программирования.

 

За бесполезные функции тему не просят приколоть повыше. ;)


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
Telemah

to mandor

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

Share this post


Link to post
Share on other sites
mandor
to mandor

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

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

Человек имеет ограниченный запас интеллектуальной энергии (да и вообще любой). Расходовать этот запас имеет смысл осмотрительно. Зачем тратить его напрасно?


По настоящему человек раскрывается только на операционном столе © Херург

Share this post


Link to post
Share on other sites
Telemah

Очень серьезное филосовское предположение об ограниченности интеллектуальной(да и вообще любой) энергии.Буду надеятся,что это не так.Но,как говориться,не все профессионалы программирования напишут прибыльную систему,но те кто не умеет программировать не напишет прибыльный код никогда.Почему бы без фанатизма и особых энергетических затрат,без спешки не изучить MQL? Ведь как обидно многим новичкам,которым кажется,что вот,все,они оседлали Грааль - осталось только в код.И здесь тупик - обращаться к профи нет средств и жаба душит (почти всегда - напрасно),и на форум выкладывать "граальную" идею жалко.А такие ветки облегчают первые шаги,типа как конструктор для начинающих.

Share this post


Link to post
Share on other sites
allogin

RickD

Большое спасибо за действительно полезные для новичков функции, и естественно сразу вопрос-просьба: При работе одновременно на нескольких валютах эксперт, призванный ловить резкие изменения на М1, дает сигнал на проведение операции сразу по нескольким валютам. Даже на Демо успевает отработать одна-две пары. Как можно заставить эксперта дублировать сигнал до срабатывания в течении заданного отрезка времени?

И еще, где нибудь можно протестировать на М1 период больший чем последний месяц? На МТ4, даже при наличии истории за год , у меня не получается!


сакрамат

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×