Rama 0 Share Posted August 9, 2010 Я столкнулся с проблемкой непонятной для меня)))): пишу советник(собрал вместе несколько индикаторов, при чём не вызываю их посредством іCustom() а прописываю весь код необходимый других индикаторов в своем советнике), откомпилировал - 0 ошибок,0 предупреждений А ЗАПУСКАТЬСЯ НА ГРАФИК НЕ ХОЧЕТ??? (МЕТАТРЕЙДЕР) В ЧЁМ ДЕЛО??? ПОДСКАЖИТЕ))) Quote Link to post Share on other sites
sergey1294 53 Share Posted August 9, 2010 Я столкнулся с проблемкой непонятной для меня)))): пишу советник(собрал вместе несколько индикаторов, при чём не вызываю их посредством іCustom() а прописываю весь код необходимый других индикаторов в своем советнике), откомпилировал - 0 ошибок,0 предупреждений А ЗАПУСКАТЬСЯ НА ГРАФИК НЕ ХОЧЕТ??? (МЕТАТРЕЙДЕР) В ЧЁМ ДЕЛО??? ПОДСКАЖИТЕ))) а кто его знает в чем дело, выкладывайте свой код, без него ни как не разобраться что вы там понаписали. Quote Link to post Share on other sites
tyro 151 Share Posted August 9, 2010 (edited) Уважаемые программисты, подскажите пожалуйста почему не выполняются операторы когда условие истино, точнее выполняются но в беспорядочном режиме (например, через раз). В логах ошибок нет. 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 не выполняется, первый раз такая проблема..., нормализация так же не помогла... Edited August 9, 2010 by tyro Quote Link to post Share on other sites
Аднер 0 Share Posted August 9, 2010 подскажите пожалуйста как узнать тикет последнего закрытого ордера определённого магика? Quote Link to post Share on other sites
sergey1294 53 Share Posted August 9, 2010 подскажите пожалуйста как узнать тикет последнего закрытого ордера определённого магика? С помощью этих функций OrderMagicNumber OrderSelect OrdersHistoryTotal OrdersTotal OrderTicket Quote Link to post Share on other sites
Аднер 0 Share Posted August 9, 2010 С помощью функции OrdersHistoryTotal я так понимаю можно узнать только общее количество закрытых и удалённых ордеров на текущем счёте? или как то всё таки можно узнасть кол-во сделок опред. магика? и как узнать тикет именно последнего закрытого ордера, именно по указанному магику? а то тут какойто замкнутый круг получается , то есть для того чтобы получить тикет , надо сначало выбрать этот ордер , а что бы его выбрать нужно знать тикет..... (покажите пожалуйста пример) Quote Link to post Share on other sites
sergey1294 53 Share Posted August 9, 2010 С помощью функции OrdersHistoryTotal я так понимаю можно узнать только общее количество закрытых и удалённых ордеров на текущем счёте? или как то всё таки можно узнасть кол-во сделок опред. магика? и как узнать тикет именно последнего закрытого ордера, именно по указанному магику? а то тут какойто замкнутый круг получается , то есть для того чтобы получить тикет , надо сначало выбрать этот ордер , а что бы его выбрать нужно знать тикет..... (покажите пожалуйста пример) for(int i=0;i<OrdersHistoryTotal();i++) { if(OrderSelect(i, SELECT_BY_POS,MODE_HISTORY)) { if (OrderMagicNumber()==Magic) { tiket=OrderTicket(); } } Quote Link to post Share on other sites
Ugar68 372 Share Posted August 9, 2010 С помощью функции 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); } Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Аднер 0 Share Posted August 9, 2010 int LastHistotyOrder(string symb, int mag); почему ругается на эту строчку? Quote Link to post Share on other sites
Ugar68 372 Share Posted August 9, 2010 (edited) int LastHistotyOrder(string symb, int mag); почему ругается на эту строчку? Приведённый выше год это пользовательская функуия. Её надо разместить за пределами функций stsrt(), init(), deinit(). А уже в своём годе вызвать функцию для получения тикета. Что ей скормить, при вызове прописано в коментарии кода функции. Например: int start() { //---- int tickethist=LastHistotyOrder(Symbol(),Magic); //---- return(0); } Далее приведённая выше функция. В итоге в переменной tickethist будет тикет последнего закрытого ордера или -1 если в истории нет ордеров с этим символом и маджиком. Edited August 9, 2010 by Ugar68 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
tyro 151 Share Posted August 9, 2010 Уважаемые программисты,подскажите пожалуйста почему не выполняются операторы когда условие истино, точнее выполняются но в беспорядочном режиме (например, через раз). В логах ошибок нет. ... Всем кто хотел помочь, но не успел - спасибо, уже разобрался . Quote Link to post Share on other sites
Аднер 0 Share Posted August 9, 2010 (edited) большое спасибо Вам за разьяснение, но я тут подумал и решил сделать так ,код ставится в функцию 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 August 9, 2010 by Аднер Quote Link to post Share on other sites
Programmer 33 Author Share Posted August 10, 2010 большое спасибо Вам за разьяснение, но я тут подумал и решил сделать так ,код ставится в функцию 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; } } Quote Link to post Share on other sites
Programmer 33 Author Share Posted August 10, 2010 большое спасибо Вам за разьяснение, но я тут подумал и решил сделать так ,код ставится в функцию 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; } } Quote Link to post Share on other sites
Лесной 1 Share Posted August 10, 2010 Подскажите в каком месте кода в индикаторе 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 и наоборот... Хочу туда строки торговли закинуть,советник получить,а куда вставить не пойму... Quote Link to post Share on other sites
Rubinovi4 296 Share Posted August 10, 2010 Подскажите в каком месте кода в индикаторе Slope Line : происходит смена цвета скользящей средней с LightBlue на Tomato и наоборот... Хочу туда строки торговли закинуть,советник получить,а куда вставить не пойму... Не будет он торговать, ответ, несколькими страницами раниее. В ветке есть советник на слопе, ищите да обрящите.. Quote Link to post Share on other sites
Лесной 1 Share Posted August 10, 2010 Не будет он торговать, ответ, несколькими страницами раниее. В ветке есть советник на слопе, ищите да обрящите.. Угу... Спасибо... Разобрался и нашёл что нужно было... Quote Link to post Share on other sites
Voldemar227 113 Share Posted August 10, 2010 скажите плиз как сюда добавить трейлинг стоп ??? 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);} Quote Трейдер и программист ... Мой блог Мой профиль Link to post Share on other sites
-Алексей- 27 Share Posted August 10, 2010 (edited) скажите плиз как сюда добавить трейлинг стоп ??? Если имеется в виду трейлинг стоп из МТ4 то никак. Для этого нужно писать функцию или взять готовую, из любого експерта в этой ветке и установить условие по которому будет вызываться эта функция. Наппример если (профит > Х) Вызвать ф-ию трейлинг. Возьми для примера советник Дум-дум. Может и другие есть но зтот я смотрел досканально. Он не очень сложный (в чебурашке по непроверенным данным 7000 строк.) и написан профессионалом. Разберись в этом коде и многие вопросы отпадут. Edited August 10, 2010 by -Алексей- Quote Link to post Share on other sites
Voldemar227 113 Share Posted August 10, 2010 Как сделать так что бы ордер откладывался на заданное колличество пунктов от Болинжера от верхней и нижней линии 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);} Quote Трейдер и программист ... Мой блог Мой профиль Link to post Share on other sites
Voldemar227 113 Share Posted August 11, 2010 Выложите плиз сюда кусок кода с трейлинг стопом . С пояснением для начинающего чайника!!! Quote Трейдер и программист ... Мой блог Мой профиль Link to post Share on other sites
Rubinovi4 296 Share Posted August 11, 2010 Пора брать за обучение.... Quote Link to post Share on other sites
sergey1294 53 Share Posted August 11, 2010 Выложите плиз сюда кусок кода с трейлинг стопом . С пояснением для начинающего чайника!!! зайди сюда, там найдешь еще много чего полезного https://alpariforum.com/thread47476.html Quote Link to post Share on other sites
GopherZ 1 Share Posted August 11, 2010 Добрый день. Осваиваю программирования на MQL и возник такой вопрос... Допустим алгоритм советника примерно следующий: -оценить вчерашний день -Выставить один ордер, в соответствии стратегии его модифицировать и по прибыли закрыть -В конце дня ордер,если не был закрыт ранее, закрывается по рыночной цене, либо если он не вступил в силу - удаляется И так же на следующий день... Вопрос в следующем: Если происходит обрыв интернета/выключили свет в течении дня... То как себя поведет советник? Надо ли специально добавить код для анализа текущей ситуации? (открытые ордера и т.п.) Чтобы советник понял на какой стадии алгоритма он находится... Спасибо Quote Link to post Share on other sites
Ugar68 372 Share Posted August 11, 2010 Вопрос в следующем:Если происходит обрыв интернета/выключили свет в течении дня... То как себя поведет советник? Надо ли специально добавить код для анализа текущей ситуации? (открытые ордера и т.п.) Чтобы советник понял на какой стадии алгоритма он находится... Спасибо Если советник пишется для тестера то не надо. Если же для реальной работы то обязательно надо учитывать всё что может произойти в реальном мире и не только разрыв связи. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Recommended Posts
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.