sviter 0 Share Posted October 25, 2018 (edited) у меня есть такой, но он ругaется на неправильные стопы: if(OrderType() == OP_BUY) { if(NormalizeDouble(Ask - OrderStopLoss(), Digits) > NormalizeDouble(dist * _Point, Digits)) tiketMod = OrderModify(OrderTicket(), 0, Ask - dist, OrderTakeProfit(), 0, Blue); } else if(OrderType() == OP_SELL) { if(NormalizeDouble(OrderStopLoss() - Bid, Digits) > NormalizeDouble(dist * _Point, Digits)) tiketMod = OrderModify(OrderTicket(), 0, Bid + dist, OrderTakeProfit(), 0, Blue); } Edited October 25, 2018 by sviter Quote Link to post Share on other sites
Ugar68 372 Share Posted October 27, 2018 А что бы не ругался на неправильные стопы, надо: 1. Нормировать стоп. 2. На случай задания слишком маленькой дистанции, перед модификацией проверить стоп на корректность. Это не обязательно если не будут использоваться очень маленькие дистанции, или на счетах ECN. Трейлинг тралит стоп даже если он не в прибыли. Выглядит как то так: double osl=OrderStopLoss(); if(OrderType()==OP_BUY)//Если ордер Buy { sl=Bid-dist*Point;//уровень стопа //Проверка надобности переноса стопа if(sl-osl>0.6*Point) { //Перенос стопа ResetLastError(); if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(sl,Digits),OrderTakeProfit(),0,clrBlue)) { Print("Ошибка переноса стопа ",_LastError); } } } if(OrderType()==OP_SELL)//Если ордер Sell { sl=Ask+dist*Point;//уровень стопа //Проверка надобности переноса стопа if(osl-sl>0.6*Point || osl<Point) { ResetLastError(); //Перенос стопа if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(sl,Digits), OrderTakeProfit(),0,clrRed)) { Print("Ошибка переноса стопа ",_LastError); } } } 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted October 29, 2018 Помогите. Лот =0.1 Стоп лосс– 100 пунктов Тейк профит =500 пунктов Как рассчитанть лот следующей позиции чтобы после убытка (Стоп лосс) компенсировать убыток сверх профита. Грубо говоря Тейк профит в настройках =500 а получиться денег при достижении профита должно как будто в настройках Тейк профит =600 Quote Link to post Share on other sites
Fargoth 1 Share Posted October 30, 2018 19 часов назад, torgf сказал: Помогите. Лот =0.1 Стоп лосс– 100 пунктов Тейк профит =500 пунктов Как рассчитанть лот следующей позиции чтобы после убытка (Стоп лосс) компенсировать убыток сверх профита. Грубо говоря Тейк профит в настройках =500 а получиться денег при достижении профита должно как будто в настройках Тейк профит =600 Лот = 0.12 Quote Link to post Share on other sites
torgf 0 Share Posted October 30, 2018 3 часа назад, Fargoth сказал: Лот = 0.12 Гениально! Quote Link to post Share on other sites
sviter 0 Share Posted November 7, 2018 Здраствуйте! Использую стратегию торговли по тренду... вот допустим я использую Moving Average с периодом 21... и если свеча закрылась выше или ниже линии, то открывается ордер.... Подскажите как ограничить открытие ордеров на каждой свече... Я хочу что бы если свеча была выше или ниже линии МА, то отрывалось только 2 ордера на первых свечах после пересечения и больше не открывалось на остальных.... ??? PHP код: Ma=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,1); if(Open[1] > Ma && Close[1] > Ma) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point ,Ask+TakeProfit*Point,0,Magic,0,Green); } Quote Link to post Share on other sites
Ugar68 372 Share Posted November 7, 2018 2 часа назад, sviter сказал: Здраствуйте! Использую стратегию торговли по тренду... вот допустим я использую Moving Average с периодом 21... и если свеча закрылась выше или ниже линии, то открывается ордер.... Подскажите как ограничить открытие ордеров на каждой свече... Я хочу что бы если свеча была выше или ниже линии МА, то отрывалось только 2 ордера на первых свечах после пересечения и больше не открывалось на остальных.... ??? PHP код: Ma=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,1); if(Open[1] > Ma && Close[1] > Ma) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point ,Ask+TakeProfit*Point,0,Magic,0,Green); } Если вкратце, надо посчитать количество открытых ордеров. Добавить условие открытия, если количе5ство открытых меньше 2, то открывать. По простому, для тестера пойдёт, Ma=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,1); if(Open[1] > Ma && Close[1] > Ma && OrdersTotal()<2) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point ,Ask+TakeProfit*Point,0,Magic,0,Green); } А по нормальному, надо в цикле перебрать ордера, отфильтровать по символу и маджику, потом посчитать. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
sviter 0 Share Posted November 7, 2018 Типа так? for (int i=0; i<OrdersTotal(); i++) if(OrderSelect(i,SELECT_BY_POS)) if(OrderSymbol()==Symbol() && OrdersTotal() < 2) { Ma=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,1); if(Open[1] > Ma && Close[1] > Ma) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point ,Ask+TakeProfit*Point,0,Magic,0,Green); } } Quote Link to post Share on other sites
Ugar68 372 Share Posted November 8, 2018 (edited) 16 часов назад, sviter сказал: Типа так? for (int i=0; i<OrdersTotal(); i++) if(OrderSelect(i,SELECT_BY_POS)) if(OrderSymbol()==Symbol() && OrdersTotal() < 2) { Ma=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,1); if(Open[1] > Ma && Close[1] > Ma) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point ,Ask+TakeProfit*Point,0,Magic,0,Green); } } Нет. Не надо всё в кучу мешать. Есть риск запутаться. Что и произошло. Сначала посчитать ордера, потом условия //Счётчик ордеров int Orders=0; for(int i=0; i<OrdersTotal(); i++) { //Выбрать ордер ResetLastError(); if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { Print("Ордер не выбран, ошибка ", _LastError); continue; } //Фильтровать по символу if(OrderSymbol()!=_Symbol)continue; //Считать ордера Orders++; } //А дальше уже условия Ma=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,1); if(Open[1] > Ma && Close[1] > Ma && Orders<2) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point ,Ask+TakeProfit*Point,0,Magic,0,Green); } В Вашем примере нет фильтрации ордеров по маджику, наверное не нужна. По этому и в моём её нет. Edited November 8, 2018 by Ugar68 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted November 8, 2018 (edited) Помогите. Хочу отметить область прямоугольником по условию. Максимальная цена за N свечей минус цена закрытия первой свечи больше 500 и цена десятой свечи равна любой цене первой свечи. При limit;=rates_total-prev_calculated; выходит за пределы array out of range При limit;=1000; строит не то что должен Чего ему нужно? double val; //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int N_=10; if(rates_total<N_) return(0); int limit;//=rates_total-prev_calculated; limit=1000; for(int i=limit; i>=0; i--) { double val; int val_index=iHighest(NULL,0,MODE_HIGH,i+N_,i+1); if(val_index!=-1) val=Close[i+val_index]; else PrintFormat("Ошибка вызова iHighest. Код ошибки=%d",GetLastError()); if(val-Close[i+1]>=500*Point && High[i+1]>Low[i+N_] && Low[i+1]<=Low[i+N_]) { ObjectCreate("bar0"+Time[i+1],OBJ_RECTANGLE,0,0,0,0,0); ObjectSet("bar0"+Time[i+1],OBJPROP_STYLE,STYLE_SOLID); ObjectSet("bar0"+Time[i+1],OBJPROP_COLOR,DarkBlue); ObjectSet("bar0"+Time[i+1],OBJPROP_BACK,true); ObjectSet("bar0"+Time[i+1],OBJPROP_TIME1,iTime(NULL,0,i+N_)); ObjectSet("bar0"+Time[i+1],OBJPROP_PRICE1,val);// ObjectSet("bar0"+Time[i+1],OBJPROP_TIME2,Time[i+1]); ObjectSet("bar0"+Time[i+1],OBJPROP_PRICE2,iLow(NULL,0,i+N_)); } } //--- return value of prev_calculated for next call return(rates_total); } Edited November 8, 2018 by torgf Quote Link to post Share on other sites
MrLexS 0 Share Posted November 9, 2018 (edited) Скрытый текст //+------------------------------------------------------------------+ //| Скрипт, выставляет 2 ордера по 2м валютам одновременно | //+------------------------------------------------------------------+ #property show_inputs enum type { t1=0, // BUY t2=1, // SELL }; //+------------------------------------------------------------------+ extern double LossOpen = 100; //открывать ордера при получении убытка extern bool AllSymbol = true; //учитывать все инструменты или только тот, на котором стоит советник extern string Comment = "777"; extern string SYMBOL1 = "EURUSD"; //первый символ extern string SYMBOL2 = "GBPUSD"; //второй символ extern double LOT1 = 0.01; //лот первого инструмента extern double LOT2 = 0.01; //лот второго инструмента input type TYPE1 = 0; //тип ордера первого инструмента input type TYPE2 = 1; //тип ордера второго инструмента extern int stoploss = 0, //уровень выставления SL, если 0, то SL не выставляется takeprofit = 0; //уровень выставления TP, если 0, то TP не выставляется extern int Slippage = 30; //проскальзывание extern int Magic = 777; extern bool MagicAll = false; //если true - закрывать все //+------------------------------------------------------------------+ int start() { double Profit; int OT; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if ((OrderMagicNumber() == Magic || MagicAll)) { OT = OrderType(); if (OT==OP_BUY) { Profit+=OrderProfit(); } if (OT==OP_SELL) { Profit+=OrderProfit(); } } } } if (Profit<=-LossOpen) { Alert("Достигнут уровень заданного убытка "+DoubleToStr(Profit,2)); OpenOrderON(); } return(0); } //-------------------------------------------------------------------- int OpenOrderON() { int Digit=(int)MarketInfo(SYMBOL1,MODE_DIGITS); double Poin=MarketInfo(SYMBOL1,MODE_POINT); double ASK=NormalizeDouble(MarketInfo(SYMBOL1,MODE_ASK),Digit); double BID=NormalizeDouble(MarketInfo(SYMBOL1,MODE_BID),Digit); double SL,TP; if (TYPE1 == OP_BUY) { if (stoploss!=0) SL = NormalizeDouble(BID - stoploss*Poin,Digit); else SL=0; if (takeprofit!=0) TP = NormalizeDouble(ASK + takeprofit*Poin,Digit); else TP=0; if (OrderSend(SYMBOL1,OP_BUY,LOT1,ASK,Slippage,SL,TP,Comment,Magic,0,Blue)!=-1) Alert("Ордер BUY лот ",LOT1," ", SYMBOL1); else Alert(SYMBOL1," send order BAY error ",GetLastError()," ",MarketInfo(SYMBOL1,MODE_ASK)," ",LOT1); } if (TYPE1 == OP_SELL) { if (stoploss!=0) SL = NormalizeDouble(ASK + stoploss*Poin,Digit); else SL=0; if (takeprofit!=0) TP = NormalizeDouble(BID - takeprofit*Poin,Digit); else TP=0; if (OrderSend(SYMBOL1,OP_SELL,LOT1,BID,Slippage,SL,TP,Comment,Magic,0,Blue)!=-1) Alert("Ордер SELL лот ",LOT1," ", SYMBOL1); else Alert(SYMBOL1," send order SELL error ",GetLastError()," ",MarketInfo(SYMBOL1,MODE_ASK)," ",LOT1); } Digit=(int)MarketInfo(SYMBOL2,MODE_DIGITS); Poin=MarketInfo(SYMBOL2,MODE_POINT); ASK=NormalizeDouble(MarketInfo(SYMBOL2,MODE_ASK),Digit); BID=NormalizeDouble(MarketInfo(SYMBOL2,MODE_BID),Digit); if (TYPE2 == OP_BUY) { if (stoploss!=0) SL = NormalizeDouble(BID - stoploss*Poin,Digit); else SL=0; if (takeprofit!=0) TP = NormalizeDouble(ASK + takeprofit*Poin,Digit); else TP=0; if (OrderSend(SYMBOL2,OP_BUY,LOT2,ASK,Slippage,SL,TP,Comment,Magic,0,Blue)!=-1) Alert("Ордер BUY лот ",LOT2," ", SYMBOL2); else Alert(SYMBOL2," send order BAY error ",GetLastError()," ",MarketInfo(SYMBOL2,MODE_ASK)," ",LOT2); } if (TYPE2 == OP_SELL) { if (stoploss!=0) SL = NormalizeDouble(ASK + stoploss*Poin,Digit); else SL=0; if (takeprofit!=0) TP = NormalizeDouble(BID - takeprofit*Poin,Digit); else TP=0; if (OrderSend(SYMBOL2,OP_SELL,LOT2,BID,Slippage,SL,TP,Comment,Magic,0,Blue)!=-1) Alert("Ордер SELL лот ",LOT2," ", SYMBOL2); else Alert(SYMBOL2," send order SELL error ",GetLastError()," ",MarketInfo(SYMBOL2,MODE_ASK)," ",LOT2); } return(0); } //-------------------------------------------------------------------- Задаю убыток, если он уже достигнут в момент установки скрипта на график то открываются ордера, а если еще не достигнут, то потом при достижении заданного убытка ордера не открываются. Что может не так? Edited November 12, 2018 by AntFX п. 13 Quote Link to post Share on other sites
Ugar68 372 Share Posted November 11, 2018 09.11.2018 в 00:47, torgf сказал: При limit;=rates_total-prev_calculated; выходит за пределы array out of range Естественно. Когда prev_calculated ещё =0, то в limit количество баров. Длина массива = количеству баров. Последний индекс массива равен длина -1. Так как индексы считаются от 0. Значит правильно будет начинать считать не с лимит, а с лимит -1. int limit=rates_total-prev_calculated; if(prev_calculated==0)limit--; for(int i=limit; i>=0; i--) 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
ZeleBoba 662 Share Posted November 13, 2018 (edited) Основная функция, используемая для совершения торговых операций или установки отложенного ордера. int OrderSend( string symbol, // символ int cmd, // торговая операция double volume, // количество лотов double price, // цена int slippage, // проскальзывание double stoploss, // stop loss double takeprofit, // take profit string comment=NULL, // комментарий int magic=0, // идентификатор datetime expiration=0, // срок истечения ордера color arrow_color=clrNONE // цвет ); comment=NULL [in] Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером. Кто знает подробности? какая часть? как изменена? знаю что туда пишется закрытие по стопам (стоп-ауту, стоп-лоссу, тейк-профиту) в квадратных скобках, но не знаю - заменой или конкатенацией. если был собственный коммент, то сохранится ли он, и если да, то существует ли какой-нить разделитель между собственным комментом и комментом сервера? Edited November 13, 2018 by ZeleBoba Quote Лучше маленький профит, чем большие рога. Link to post Share on other sites
Ugar68 372 Share Posted November 13, 2018 2 часа назад, ZeleBoba сказал: Основная функция, используемая для совершения торговых операций или установки отложенного ордера. int OrderSend( string symbol, // символ int cmd, // торговая операция double volume, // количество лотов double price, // цена int slippage, // проскальзывание double stoploss, // stop loss double takeprofit, // take profit string comment=NULL, // комментарий int magic=0, // идентификатор datetime expiration=0, // срок истечения ордера color arrow_color=clrNONE // цвет ); comment=NULL [in] Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером. Кто знает подробности? какая часть? как изменена? знаю что туда пишется закрытие по стопам (стоп-ауту, стоп-лоссу, тейк-профиту) в квадратных скобках, но не знаю - заменой или конкатенацией. если был собственный коммент, то сохранится ли он, и если да, то существует ли какой-нить разделитель между собственным комментом и комментом сервера? Честно говоря уже не помню сколько максимальное количество символов в комментарии. Добавляется часть, добавлением, но если добавляемая часть не влазить в свободное количество символов то часть комментария ордера будет заменена добавляемым. Столько символов, сколько не влезло. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
MG4 3,094 Share Posted November 13, 2018 2 часа назад, ZeleBoba сказал: Кто знает подробности? какая часть? как изменена? стоп и тейк пишут в хвост "комментарий" => "комментарий[tp]" или "комментарий[sl]" при экспирации комментарий затирают пишут "expiration [2018.11.12 22:44]" при частичном закрытии комментарий затирается у закрывшейся части становится "to #123456888" у оставшейся в рынке тоже затирается становится "from #123456777" 1 Quote — Маржинкольщик наколи мне маржинкол. Только качественная аналитика в ветке ПАММ-а MTSavg Link to post Share on other sites
AntFX 6,474 Share Posted November 13, 2018 3 часа назад, ZeleBoba сказал: Кто знает подробности? какая часть? как изменена? На коммент желательно вообще не рассчитывать кроме той ситуации, когда Вы точно знаете на какое поведение сервера конкретного типа счета конкретного брокера Вам можно рассчитывать, потому что в принципе изменять могут весь коммент. Quote 1 Link to post Share on other sites
ZeleBoba 662 Share Posted November 14, 2018 всем спасибо. Quote Лучше маленький профит, чем большие рога. Link to post Share on other sites
sviter 0 Share Posted November 26, 2018 Здравствуйте! Дайте пожалуйста готовый код трала с шагом и безубытком!!! тоесть что бы через количество шагов сработал безубыток и все! Quote Link to post Share on other sites
sviter 0 Share Posted November 28, 2018 Здраствуйте! делаю безубыточник! помогите, ато ругается на error 130, а иногда и срабатывает как положено!!! кароче когда как!!! что тут не так? void Tralorder() { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS)==true) { if(OrderType()==OP_BUY) { if(Bid>NormalizeDouble(OrderOpenPrice()+shagtrala*Point,Digits) && OrderStopLoss()<NormalizeDouble(OrderOpenPrice()+lTrailingDistance*Point,Digits)) if(OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() + (lTrailingDistance * _Point),0,0,clrGreen)==false) Print(GetLastError()); } if(OrderType()==OP_SELL) { if(Bid<NormalizeDouble(OrderOpenPrice()-shagtrala*Point,Digits) && OrderStopLoss()>NormalizeDouble(OrderOpenPrice()-lTrailingDistance*Point,Digits)) if(OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() - (lTrailingDistance * _Point),0,0,clrRed)==false) Print(GetLastError()); } } } } Quote Link to post Share on other sites
Ugar68 372 Share Posted November 29, 2018 1. Нормировать обязательно нужно при отправке приказа. А вот при выяснении надобности модификации, нормировать не обязательно, там можно прибавить допуски в пол пункта, для верности. 2. 130 может быть при слишком близких стопах. Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted December 3, 2018 11.11.2018 в 21:12, Ugar68 сказал: Спасибо. Quote Link to post Share on other sites
torgf 0 Share Posted December 4, 2018 Подскажите как действовать. Хочу заполнить буфер на первом баре, если бар в любое время был равен цене открытия любого бара, при условии что 2 или более баров были однонаправлены при росте а так же при снижении. Например три бара однонаправлены вверх и два однонаправлены вниз, один вверх и пять вниз. Общее количество не имеет значения. Quote Link to post Share on other sites
AntFX 6,474 Share Posted December 4, 2018 4 минуты назад, torgf сказал: Подскажите как действовать. Хочу заполнить буфер на первом баре, если бар в любое время был равен цене открытия любого бара, при условии что 2 или более баров были однонаправлены при росте а так же при снижении. Не слишком тривиально и требует уточнения условий имхо. Старайтесь писать условия по пунктам, в каждом пункте простейшее отношение одной величины к другой, и так до полного описания всех требуемых действий... 1 Quote 1 Link to post Share on other sites
torgf 0 Share Posted December 4, 2018 (edited) AntFX, поняла, опишу условие для первой стрелки на первом снимке. если любая цена первого бара равна цене открытия седьмого бара и 3 бара подряд бычьи за ними 4 бара подряд медвежьи. (образование из 7 баров) получилась перевёрнутая пирамидка) но, было бы выполнено условие если были бы 4 бара подряд медвежьи и один бар бычий (первый) и его цена в любой точке равна цене открытия пятого бара.(образование из 5 баров) Обобщу: минимум 2 бара подряд одного цвета, цена первого бара равна цене открытия самого дальнего из серии баров одного цвета. Edited December 4, 2018 by torgf Quote Link to post Share on other sites
sviter 0 Share Posted December 13, 2018 Добрый вечер! Подскажите как лучше реализовать следующую идею.... Брать последние фракталы и когда цена их пробивает, то открывать ордера... Беру фракталы стандартными кодами от kimiva, а вот как правильно сравнивать не понятно, то ли сравнивать по цене, то ли по барам??? 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.