Вопрос вот такой

 
Мы тут советничка тестируем. Смысл в том, что он с утра меряет диапазон, а потом в течении дня открывается на его пробое с рынка. Возникли сложности- на тесте сделки есть, а на демо- не всегда. Предполагаю, что советник(комп, мт) выключался в перерыве между временем измерения диапазона и временем открытия. То есть, если такое имело место- советник не откроется, так как он не помнит, что он там с утра насчитал. Я прав? Надо в файл писАть, а потом считывать? Расскажите поподробнее пожалуйста- чего нельзя делать, чтобы советник не забыл значения- таймфрейм хоть можно переключать? Вот, на всякий случай, код(последняя версия), хотя все его и так давно знают вроде. Извините, что не причёсанный-и так еле еле написал.
#property copyright "Dan" #property link "3172552@gmail.com" #include <stdlib.mqh> #define MN_8 8 #define MN_12 12 //---- input parameters extern int Hours2Check= 14; //9 //14 //15 extern int CloseHour= 9; //9 //9 //9 extern int DaysMode= 1; //1 //2 //2 extern int Days2Check= 5;//14 //7 //14 //10 extern int CheckMode= 1; //2 //1 //2 extern double LossK= 2; //1 //2 //0.5 extern double ChannelK= 1.5; //0.5 //1.5 //0.5 extern int CheckHour_8= 8; //8 //8 //8 extern double ProfitK_8= 2; //1 //2 //1 extern double OffsetK_8= 2.5; //1 //2.5 //1.5 extern int CheckHour_12= 12; //12 //12 //12 extern double ProfitK_12= 2.5; //0.5 //4 //0.5 extern double OffsetK_12= 2.5; //1 //2.5 //1 //extern int MarginPercent= 20; extern bool UseMM= false; extern int TradesPerDayAllowed= 2; ////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// int MaxSystemDD=240; //here You have to insert max dd without MM in pips int SystemTrustK=1; int MaxDD_Allowed=10; double Lots=0.1; int LatestOpenHour=22; int MaxTries=5; int PointPrice=10; double ISK=1.5; ///////////////////////////////////////////////////// int Pause; int err; int try; int ticket; bool close; int i; int OpenDay; int p; int InsuranceStop; int loss; int D2Ch; int pp_8; int profit_8; int offset_8; int avrange_8; int CheckDay_8; int pp_12; int profit_12; int offset_12; int avrange_12; int CheckDay_12; double sellprice_8; double buyprice_8; double daj_8; double hh_8; double ll_8; double totalrange_8; double channel_8; double sellprice_12; double buyprice_12; double daj_12; double hh_12; double ll_12; double totalrange_12; double channel_12; //////////////////////////////////////////////////////////// //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- D2Ch=Days2Check; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } ///////////////////////////////////////////////////////////////////// void Levels_Defining_12() { pp_12=(((CheckHour_12-CheckHour_8)*60)/Period()); hh_12=High[Highest(NULL,0,MODE_HIGH,pp_12,1)]; ll_12=Low[Lowest(NULL,0,MODE_LOW,pp_12,1)]; p=((24*60)/Period()); totalrange_12=0; channel_12=hh_12-ll_12; if (CheckMode==1) { for(i=1;i<=Days2Check;i++) { daj_12=(High[Highest(NULL,0,MODE_HIGH,p,p*(i-1)+1)] -Low[Lowest(NULL,0,MODE_LOW,p,p*(i-1)+1)]); totalrange_12=totalrange_12+daj_12; } } if (CheckMode==2) { for( i=1;i<=Days2Check;i++) { daj_12=MathAbs(Close[p*i+pp_12]- Close[p*(i-1)+pp_12]); totalrange_12=totalrange_12+daj_12; } } avrange_12=MathRound((totalrange_12/Days2Check)/Point); offset_12=MathRound(avrange_12/OffsetK_12); sellprice_12=NormalizeDouble(ll_12-offset_12*Point,4); buyprice_12=NormalizeDouble(hh_12+offset_12*Point,4); return; } //*/* ///////////////////////////////////////////////////////////// void Levels_Defining_8() { pp_8=((Hours2Check*60)/Period()); hh_8=High[Highest(NULL,0,MODE_HIGH,pp_8,1)]; ll_8=Low[Lowest(NULL,0,MODE_LOW,pp_8,1)]; p=((24*60)/Period()); totalrange_8=0; channel_8=hh_8-ll_8; if (CheckMode==1) { for(i=1;i<=Days2Check;i++) { daj_8=(High[Highest(NULL,0,MODE_HIGH,p,p*(i-1)+1)] -Low[Lowest(NULL,0,MODE_LOW,p,p*(i-1)+1)]); totalrange_8=totalrange_8+daj_8; } } if (CheckMode==2) { for( i=1;i<=Days2Check;i++) { daj_8=MathAbs(Close[p*i+pp_8]- Close[p*(i-1)+pp_8]); totalrange_8=totalrange_8+daj_8; } } avrange_8=MathRound((totalrange_8/Days2Check)/Point); offset_8=MathRound(avrange_8/OffsetK_8); sellprice_8=NormalizeDouble(ll_8-offset_8*Point,4); buyprice_8=NormalizeDouble(hh_8+offset_8*Point,4); return; } //*/* /////////////////////////////////////////////////////////////_8 void Close_by_Closetime() { for(i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if((OrderMagicNumber()!=MN_8 && OrderMagicNumber()!=MN_12) || OrderSymbol()!=Symbol() ) continue; if (OrderType()==OP_BUY) { for(int try=1;try<=MaxTries;try++) { while (!IsTradeAllowed()) Sleep(5000); close=false; RefreshRates(); close=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,4),3,White); Sleep(Pause); if (close){Pause=1000;break;} else { err=GetLastError(); Print("OrderClose failed with error #",err," : ",ErrorDescription(err),"Trying Again #",try); Pause=Pause*2; if (try==MaxTries) { Pause=1000; Print("Warning!!!Last try failed!"); SendMail("Warning!!!Last try failed! ",OrderType()+" by "+OrderClosePrice()+" Cloing Failed!"); break; } } } } if (OrderType()==OP_SELL) { for(try=1;try<=MaxTries;try++) { while (!IsTradeAllowed()) Sleep(5000); close=false; RefreshRates(); close=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,4),3,White); Sleep(Pause); if (close){Pause=1000;break;} else { err=GetLastError(); Print("OrderClose failed with error #",err," : ",ErrorDescription(err),"Trying Again #",try); Pause=Pause*2; if (try==MaxTries) { Pause=1000; Print("Warning!!!Last try failed!"); SendMail("Warning!!!Last try failed! ",OrderType()+" by "+OrderClosePrice()+" Cloing Failed!"); break; } } } } } } ///////////////////////////////////////////////////////////////*/ /////////////////////////////////////////////////////////////// void Close_by_Stops_8() { for(i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MN_8 || OrderSymbol()!=Symbol()) continue; if ((OrderType()==OP_BUY) && (((Close[1]-NormalizeDouble(OrderOpenPrice(),4))>=profit_8*Point) || ((NormalizeDouble(OrderOpenPrice(),4)-Close[1])>=loss*Point))) { for(int try=1;try<=MaxTries;try++) { while (!IsTradeAllowed()) Sleep(5000); close=false; RefreshRates(); close=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,4),3,White); Sleep(Pause); if (close){Pause=1000;break;} else { err=GetLastError(); Print("OrderClose failed with error #",err," : ",ErrorDescription(err),"Trying Again #",try); Pause=Pause*2; if (try==MaxTries) { Pause=1000; Print("Warning!!!Last try failed!"); SendMail("Warning!!!Last try failed! ",OrderType()+" by "+OrderClosePrice()+" Cloing Failed!"); break; } } } } if ((OrderType()==OP_SELL) && (((Close[1]-NormalizeDouble(OrderOpenPrice(),4))>=loss*Point) || ((NormalizeDouble(OrderOpenPrice(),4)-Close[1])>=profit_8*Point))) { for(try=1;try<=MaxTries;try++) { while (!IsTradeAllowed()) Sleep(5000); close=false; RefreshRates(); spa
 
В коде не разбирался, но думаю, что можно в любое время искать этот "утренний" диапазон.
Просто каждый раз при запуске (в init) высчитывать его, а потом смотреть - нет ли пробоя ;)
 
Спасибо, попробуем...
 
Мда... mandor, так 3172552 и является автором этой системы, он и есть :)...
Источник кода советника - альпаревский форум
, а ты только, что сознался в воровстве... :) Вот поэтому, 3172552, тебе никто и не поможет... :) Видишь ли, любой проффессионал может сделать из твоей идеии вот что... :)
Файлы:
 
mandor:
to Registr
Код этого советника выложен в свободном доступе как на альпаревском, так и на этом форуме. На Альпари лежит здесь: http://forum.alpari-idc.ru/viewtopic.php?t=47177&start=14. Никто (и тем более я) авторство не оспаривает. Почему я назван вором?

PS: Пришлёпнутая картика красивая, но ни о чём. Поди сам (как профессионал) от руки рисовал, раз идея не озучена ;-)
... это шутка, какое же может быть воровсто, если автор развешивает свои идеи чуть-ли не каждом столбе :) ... вобще-то тема эта начата где-то в финлисте, по моему. Автор сам подчерпнул там начало своей идеи, но дальнейшие наблюдения и выводы он сделал сам. Надо сказать, весьма правильные выводы. Что касается рисунка, то эквити как раз этого советника, только усовершенствованного. И без всяких там ММ и TradesPerDayAllowed. А вот оригинал... Кстати, как говорил Ренат, качество кода ужасное :) ... Я объяснял автору, как ему надо было сделать, чтобы его советник был хотя бы более читаем, но воз и ныне там :) ... Нет, конечно, разобраться можно, но зачем? :) Кстати, mandor, по моему из твоего поста, что-то изчезло, или мне показалось?
Файлы:
 
Вот поэтому, 3172552, тебе никто и не поможет... :) Видишь ли, любой проффессионал может сделать из твоей идеии вот что... :)
Как никто? Мне человек 5 свои варианты присылают, кое-что почерпнул, и из Ваших постов много почерпнул, советник уже 100 раз переписан, кое-кто им на реале уже пару сотен срубил.
PS: Пришлёпнутая картика красивая, но ни о чём. Поди сам (как профессионал) от руки рисовал, раз идея не озучена ;-)
Да, кстати, могли бы и поделиться, хотя бы с некоторыми- чего в алгоритме поменяли?Какая идея? Я всё пытался оптимизировать его, чтоб и до 2003 года работал- безрезультатно, а у Вас получилось.

Т.е. нахожу смещение до начального бара, от которого строится диапазон. Проверяю последние 24 бара, поскольку период H1. Источник кода советника - альпаревский форум. Подробности:
Спасибо.
2Registr- С выздоровлением
 
Вместо
pp_8=Hours2Check;
hh_8=High[Highest(NULL,0,MODE_HIGH,pp_8,1)];
ll_8=Low[Lowest(NULL,0,MODE_LOW,pp_8,1)];

Я сделал так:
StartBar=0;
for (i=0;i<=24;i++)
{
if (TimeHour(Time[i])==CheckHour_08) {StartBar=i+1; break;}
}
pp_08=Hours2Check;
hh_08=High[Highest(NULL,0,MODE_HIGH,pp_08,StartBar)];
ll_08=Low [Lowest (NULL,0,MODE_LOW ,pp_08,StartBar)];
Думаю, можно попроще, типа
for(i=0;i<2;i++) {//в 8 утра считаем диапазон за Bars2Check свечей, а в 12- за 4 часа if(numb==1){Bars2Check_x[numb]=((CheckHour_x[1]-CheckHour_x[0])*60)/Period();} else {Bars2Check_x[numb]=(Hours2Check*60)/Period();} //рассчёт диапазона if ( Hour()>=CheckHour_x[numb]) { hh_x[numb]=High[Highest(NULL,0,MODE_HIGH,Bars2Check_x[numb],((Hour()-CheckHour_x[numb])*60)/Period()+1)]; ll_x[numb]=Low[Lowest(NULL,0,MODE_LOW,Bars2Check_x[numb],((Hour()-CheckHour_x[numb])*60)/Period()+1)]; BarsPerDay=(24*60)/Period(); totalrange_x[numb]=0; channel_x[numb]=hh_x[numb]-ll_x[numb]; //рассчёт среднего диапазона за Days2Check 24-х часовых диапазонов for(i=1;i<=Days2Check;i++) { daj_x[numb]=High[Highest(NULL,0,MODE_HIGH,BarsPerDay,BarsPerDay*(i-1)+((Hour()-CheckHour_x[numb])*60)/Period()+1)] -Low[Lowest(NULL,0,MODE_LOW,BarsPerDay,BarsPerDay*(i-1)+((Hour()-CheckHour_x[numb])*60)/Period()+1)]; totalrange_x[numb]=totalrange_x[numb]+daj_x[numb]; avrange_x[numb]=MathRound((totalrange_x[numb]/i)/Point); } } //используем средний диапазон прошлых Days2Check 24-х периодов, для рассчёта оффсет, лосс и профит //ещё рассчитываем цены покупок и продаж offset_x[numb]=MathRound(avrange_x[numb]/OffsetK_x[numb]); sellprice_x[numb]=NormalizeDouble(ll_x[numb]-offset_x[numb]*Point,4); buyprice_x[numb]=NormalizeDouble(hh_x[numb]+offset_x[numb]*Point,4); profit_x[numb]=MathRound(avrange_x[numb]/ProfitK_x[numb]); loss_x[numb]=MathRound(avrange_x[numb]/LossK_x[numb]);
 
Привет, Digits ;).
2Registr- С выздоровлением
Спасибо, за заботу. Чесно говоря, я ещё не выздоровел до конца, млин, от остехандроза так легко не отделаешься :). Извини, но своей идеей я с тобой поделиться не могу. Слишком уж демократично ты с идеями обращаешься :). Нет, если б мы были с тобой одни на всём форексе, то с удовольствием :), а так, извини... Перепиши всё-таки советник как я тебе советовал, тебе же будет легше с ним разбираться.
Читабельность кода - дело вкуса. Раньше с программистов требовали подробные рисунки алгоритма программы. Я уже тогда начальников, требующих красивых картинок и читабельного текса посылал (давно это было ...). Красота не в читабельности, а наличии стиля. Это так везде по жизни.

Раньше начальниками были инженеры, которые требовали блок-схемы для того, чтобы в твоей программе разбирался не только ты. А сейчас начальники долбо...бы, которые смутно понимают зачем вообще нужны программисты, и держут их только потому, что им кто-то сказал, что без них трудно... А почему трудно - они не понимают. Соотвественное отношение к проффессии программиста.
 
Слишком уж демократично ты с идеями обращаешься :).
Это со своими... Чужие не имею права. В любом случае, спасибо хотя бы за то, что показали, что можно ещё и до 2003 года зарабатывать.
... вобще-то тема эта начата где-то в финлисте, по моему. Автор сам подчерпнул там начало своей идеи,
Эта тема обсуждается на КАЖДОМ форуме, связанном с форексом.
Причина обращения: