//le maxi de minis.mq4 //Evgeny I. SHCHERBINA #property copyright "Evgeny I. SHCHERBINA" extern double lot = 0.1; double maxi = 0, mini = 0; int timer1 = 120, ts = 0, ticket, t_modify, g_ticket = 0; string object; int init(){ if(OrdersTotal() == 0){ maxi = 0; mini = 0; ts = 0; ObjectDelete("arrow1"); ObjectDelete("arrow2"); } /*else{ Вообще какойто бред OrderSelect(0,SELECT_BY_POS); if(OrderType() == OP_SELL && (OrderStopLoss() <= OrderOpenPrice())){ ts = 1; }else if(OrderType() == OP_BUY && (OrderStopLoss() >= OrderOpenPrice())){ ts = 1; } }*/ //timer1_ticking(); } int start(){ if(OrdersTotal() == 0){ //if(g_ticket > 0){!!! mini = 0; maxi = 0; ts = 0; g_ticket = 0; ObjectDelete("arrow1"); ObjectDelete("arrow2"); //} find_maxi(); find_mini(); } if(OrdersTotal() > 0){ OrderSelect(0,SELECT_BY_POS); //g_ticket = OrderTicket();!!! if(OrderType() == OP_SELL && (OrderOpenPrice()-50*Point) >= Bid && ts == 0){ t_modify = OrderModify(OrderTicket(),OrderOpenPrice(),Bid+50*Point,OrderTakeProfit(),0,Red); ts = 1; }else if(OrderType() == OP_SELL && (OrderStopLoss()-100*Point) >= Bid && ts == 1){ t_modify = OrderModify(OrderTicket(),OrderOpenPrice(),Bid+100*Point,OrderTakeProfit(),0,Red); } if(OrderType() == OP_BUY && (OrderOpenPrice()+50*Point) <= Ask && ts == 0){ t_modify = OrderModify(OrderTicket(),OrderOpenPrice(),Ask-50*Point,OrderTakeProfit(),0,Red); ts = 1; }else if(OrderType() == OP_BUY && (OrderStopLoss()+100*Point) <= Ask && ts == 1){ t_modify = OrderModify(OrderTicket(),OrderOpenPrice(),Ask-100*Point,OrderTakeProfit(),0,Red); } } return; } /*int timer1_ticking(){ while(timer1 >= 0){ timer1--; object = "Поиск экстремумов: " + timer1 + " сек."; ObjectSetText("Obj",object,12,"Times New Roman",Aqua); ObjectCreate("Obj",OBJ_LABEL, 0, 0, 0); ObjectSet("Obj", OBJPROP_XDISTANCE, 5); ObjectSet("Obj",OBJPROP_YDISTANCE,20); Sleep(1000); } }*/ int find_maxi(){ int i; double oc1, oc2, oc3, oc4, oc5, oc6, oc7; //for(i=0; i>=0; i++){Видимо из индюка стянули, вообще какаято ерунда дальше идет i=0;//!!! if(Close[i] > Open[i]){oc4 = Close[i];} else{oc4 = Open[i];} if(oc4 > Bid){//Bid равен Close[0] if(Close[i-3] > Open[i-3]){oc1 = Close[i-3];}//Смысл этого какой? else{oc1 = Open[i-3];} if(Close[i-2] > Open[i-2]){oc2 = Close[i-2];} else{oc2 = Open[i-2];} if(Close[i-1] > Open[i-1]){oc3 = Close[i-1];} else{oc3 = Open[i-1];} if(Close[i+1] > Open[i+1]){oc5 = Close[i+1];} else{oc5 = Open[i+1];} if(Close[i+2] > Open[i+2]){oc6 = Close[i+2];} else{oc6 = Open[i+2];} if(Close[i+3] > Open[i+3]){oc7 = Close[i+3];} else{oc7 = Open[i+3];} if(oc1 <= oc4 && oc2 <= oc4 && oc3 <= oc4 && oc5 <= oc4 && oc6 <= oc4 && oc7 <= oc4){ if(maxi == 0){ObjectDelete("arrow1"); maxi = oc4;} ObjectCreate("arrow1",OBJ_ARROW, 0, Time[i], High[i]+0.001); ObjectSet("arrow1",OBJPROP_ARROWCODE,218); ObjectSet("arrow1",OBJPROP_COLOR,Aqua); break; } } if(maxi == Bid){open_order(1);}//Из этой строки можно сделать вывод что i=0(выше), иначе торговля вестись не будет соответственно убрать цикл //} } int find_mini(){ int i; double oc1, oc2, oc3, oc4, oc5, oc6, oc7; for(i=0; i>=0; i++){ if(Close[i] < Open[i]){oc4 = Close[i];} else{oc4 = Open[i];} if(oc4 < Bid){ if(Close[i-3] < Open[i-3]){oc1 = Close[i-3];} else{oc1 = Open[i-3];} if(Close[i-2] < Open[i-2]){oc2 = Close[i-2];} else{oc2 = Open[i-2];} if(Close[i-1] < Open[i-1]){oc3 = Close[i-1];} else{oc3 = Open[i-1];} if(Close[i+1] < Open[i+1]){oc5 = Close[i+1];} else{oc5 = Open[i+1];} if(Close[i+2] < Open[i+2]){oc6 = Close[i+2];} else{oc6 = Open[i+2];} if(Close[i+3] < Open[i+3]){oc7 = Close[i+3];} else{oc7 = Open[i+3];} if(oc1 >= oc4 && oc2 >= oc4 && oc3 >= oc4 && oc5 >= oc4 && oc6 >= oc4 && oc7 >= oc4){ if(mini == 0){ObjectDelete("arrow2"); mini = oc4;} ObjectCreate("arrow2",OBJ_ARROW, 0, Time[i], Low[i]-0.0005); ObjectSet("arrow2",OBJPROP_ARROWCODE,217); ObjectSet("arrow2",OBJPROP_COLOR,Aqua); break; } } if(mini == Bid){open_order(2);} } } int open_order(int type){ if(OrdersTotal() == 0){ if(type == 1){ ticket = OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+100*Point,mini,"sh_order",356111515938,0,Green); }else if(type == 2){ ticket = OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-100*Point,maxi,"sh_order",356111515938,0,Green); } } }
Код очень плохой, в нем дофига ошибок логических в том числе. Не торгует больше дня, и виснет от того что не может выйти из цикла в ваших функция по максимумам минимум. Выделил основные ошибки. Но так как не понял что анализирует данный советник, нет возможностей сделать его рабочим по вашей тс.
Ну, с таким количеством "выявленных" ошибок, не мне за голову браться (я тут слава богу программить научился в свои 27), а тому кто нашел эти ошибки...
Почитайте описание что и как работает выше (пункты 1-3), чтобы не задавать вопросы, смысл этого какой )))
А ошибку я нашел уже и исправил. Не работало пушто в определенный момент советник не мог найти новый максимум (минимум) на 15-мин свечках. То есть он конечно есть, но уходил слишком далеко... Я ведь не ограничиваю поиск максимума (минимума) каким-то количеством свечек. Теперь ограничил, если максимум (минимум) не найден в диапазоне 300 15-мин. свечек, определять его как Bid+300*Point для максимума соответветственно.
Так что все кул, протестил, все работает )))))))) Всем спасибо, все свободны
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В приложении советник, делает следующее:
1. Определяет минимум и максимум
2. При достижении минимума или максимума - открывает сделку соответственно на покупку или на продажа
3. Стоплосс и тейк профит выставляются сразу, трейлинг стоп если сделка выходит в плюс
Проблема млин в том, что тестируется этот советник только на один день.
Если выбрать любой период больше одного дня, в истории появляются сделки только за первый день.
Дальше просто бесполезно процессор парится... Никаких новых сделок в истории не появляется ни за час ни за два часа тестирования
С одной стороны советник простой. Но я думаю проблема в том, что при закрытии сделки, советник не может сбросить старые значения минимума и максимума.
Если вживую торговать, то просто ручками мона все удалить... В общем, в итоге я добавил следующее:
4. Сделка открыта - определить ее тикет, сохранить в глобальной переменной
5. Сделка закрыта, проверить есть ли тикет (глобальная переменная не равна ноль), если да - обнулить все значения, отчистить график от стрелок млин всяких
6. Обнулить тикет
Обнулять можно только по тикету (то есть вот только что закрылась сделка), а не постоянно, потому что так минимум и максимум меняются постоянно, и сделка просто не заключается