закрытии позици
по тэйк профиту как бы заново отсчитывался тэйк профит и до
тех пор пока не вернется на опр кол-во пунктов назад. Хелп ми
плиз.
Люди!!! Всю голову сломал уже! Не могу придумать как сделать!!!
Нужно сделать так: открывается позиция стоп 20п. профит 15п. если
достигается профит то открываемся в этом же направлении только
если цена вернется "назад" на определенное количество
пунктов. В программе этот параметр SellTral && BuyTrall. Если не варачивается
и идет в том же направлении то нужно, чтобы при - Momentum - Осцилляторы - Индикаторы - Чарты - MetaTrader 5 для Android
- Momentum - Осцилляторы - Индикаторы - Чарт - MetaTrader 5 для iPhone
- Momentum - Осцилляторы - Использование технических индикаторов - Графики котировок, технический и фундаментальный анализ
help
Попробуй вместо T/P использовать максимально достигнутую величину
профита (MaxProf) и его цену (MaxBid) и сравнивай ее с текущим профитом
(CurProf). И попробуй реализовать свою идею. Закрывать ордер можно
по условию: if (MaxProf>=15 && MaxProf-CurProf>2), т.е. снижение от макс на
N пунктов. “Если достигается профит то открываемся в этом же
направлении только если цена вернется "назад" на определенное
количество пунктов”, это можно реализовать примерно так, if
(LastType==OP_BUY && MaxBid-Bid>X), то открываем на BUY. И продолжаем в этом
духе.
Buy=Ask;Строчка изумила. Тут что то не то.
Itso:
Buy=Ask;Строчка изумила. Тут что то не то.
Да сейчас сам посмотрел не очень понимаю зачем так.
Вот вроде теперь все правильно а не работает... так чего не так сдела?
lvs вот что то вроде этого,?! или идея другая, я что-то не совсем понял что такое MaxProf MaxBid, как их задать ?
extern double BuyTral = 2; extern double SellTral = 0.5; extern double TakeProfit = 17; extern double Lots = 1; extern double TrailingStop = 12; extern double Stop = 20; extern double Delta = 5; extern double DeltPersent = 30; //+------------------------------------------------------------------+ double TPsel, TPbuy; int start() { double buy, sell,SL; double coef; int cnt, ticket, total; // initial data checks ----------------------------------------------+ if(Bars<100) { Print("bars less than 100"); return(0); } if(TakeProfit<2) { Print("TakeProfit less than 200"); return(0); // check TakeProfit } coef=iCustom(NULL,0,"CoeffofLine",5,3000,0,0); total=OrdersTotal(); if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // 000000 00 00 00 00 00 // 00 00 00 00 00 00 0000 // 000000 00 00 0000 00000000 // 00 00 00 00 00 00 // 000000 000000 00 0000000000000000000000000000 if(coef>0 && Bid<=BuyTral) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Ask-Stop*Point,Ask+TakeProfit*Point,"priceEX",16384,0,Green); if(ticket>0) { TPbuy=Ask+TakeProfit*Point; if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); //MODE_TRADES } else Print("Error opening BUY order : ",GetLastError()); return(0); } // 0000000 0000000 00 00 0000000000000000000000000000 // 00 00 00 00 00 // 0000000 00000 00 00 00000000 // 00 00 00 00 0000 // 0000000 0000000 0000000 0000000 00 if(coef<0 && Ask>=SellTral) { //Bid+TrailingStop*Point,Bid-TakeProfit*Point ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,Bid+Stop*Point,Bid-TakeProfit*Point,"priceEX",16384,0,Red); if(ticket>0) { TPsel=Bid-TakeProfit*Point; if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); //,MODE_TRADES } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } if (Ask>=(TPbuy+TakeProfit*Point)) TPbuy=Ask; if (Bid<=(TPsel-TakeProfit*Point)) TPsel=Bid; if (Ask>=TPbuy) BuyTral=TPbuy-Point*TakeProfit*(DeltPersent/100); if (Bid<=TPsel) SellTral=TPsel+Point*TakeProfit*(DeltPersent/100); // 00 // 00 // 0000000 00 000000 0000000 00000000 00 // 00 00 00 00 00 00 00 00 // 00 00 00 00 0000000 000000 00 000 // 00 00 00 00 00 00 000000 // 0000000 00000000 000000 0000000 00000000 0000 for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(coef<0) { OrderClose(OrderTicket(),OrderLots(),Bid,5,Violet); return(0); // exit } // check for trailing stop if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid - Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } else // go to short position { if(coef>0) { OrderClose(OrderTicket(),OrderLots(),Ask,5,Violet); return(0); // exit } // check for trailing stop if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); }
MaxProf – это максимальная прибыль, которая была достигнута с момента
открытия ордера, а MaxBid – курс валютной пары в точке где был зафиксирован
MaxProf. Анализирую MaxProf тебе не придется открывать новый ордер
каждый раз, когда старый закрылся по t/p, а курс продолжает идти
в том же направлении.
lsv писал (а):
MaxProf – это максимальная прибыль, которая была достигнута с момента открытия ордера, а MaxBid – курс валютной пары в точке где был зафиксирован MaxProf. Анализирую MaxProf тебе не придется открывать новый ордер каждый раз, когда старый закрылся по t/p, а курс продолжает идти в том же направлении.
MaxProf – это максимальная прибыль, которая была достигнута с момента открытия ордера, а MaxBid – курс валютной пары в точке где был зафиксирован MaxProf. Анализирую MaxProf тебе не придется открывать новый ордер каждый раз, когда старый закрылся по t/p, а курс продолжает идти в том же направлении.
ну если я все правильно понял, то в этой программе я и так пытаюсь реализовать такую систему, посмотрите, возможно я где то что то сделал не так или вообще все не так. Знаю что дело это неблагодарное разбираться в чужих кодах, но другой надежды у меня нет, ну не получается у меня. Я только учусь
projectX писал (а):
Знаю что дело это неблагодарное разбираться в чужих кодах, но другой надежды у меня нет, ну не получается у меня. Я только учусь
Знаю что дело это неблагодарное разбираться в чужих кодах, но другой надежды у меня нет, ну не получается у меня. Я только учусь
extern double TakeProfit = 15; extern double Lots = 1; extern double TrailingStop = 12; extern double Stop = 20; extern double Delta = 5; extern double DeltaTral_inPerset = 80; double BuyTral; double SellTral; int total=0; int prevtotal; //+----------------------------------------------------------+ int GetLastOrderHist() { int ticket = -1; datetime dt = 0; int cnt = HistoryTotal(); for (int i=0; i < cnt; i++) { if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; if (OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != 16384) continue; if (OrderType() != OP_BUY && OrderType() != OP_SELL) continue; if (OrderCloseTime() > dt) { dt = OrderCloseTime(); ticket = OrderTicket(); } } return (ticket); } //+----------------------------------------------------------+ int start() { double Buy, Sell, TakePrFalseBuy, StopLossFalseBuy, TakePrFalseSell, StopLossFalseSell, LimitPrice; double alfa, alfaprev; int cnt, ticket, FalsStart; BuyTral = Point*TakeProfit*(1-DeltaTral_inPerset/100); SellTral = Point*TakeProfit*(1-DeltaTral_inPerset/100); // initial data checks ---------------------------------------+ if(Bars<100) { Print("bars less than 100"); return(0); } if(TakeProfit<2) { Print("TakeProfit less than 2"); return(0); // check TakeProfit } alfa=iMA(NULL,0,13,0,MODE_SMMA,PRICE_MEDIAN,0); alfaprev=iMA(NULL,0,13,0,MODE_SMMA,PRICE_MEDIAN,1); prevtotal=total; total = 0; for (int i=0; i<OrdersTotal(); i++) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if ((OrderSymbol()==Symbol())&&(OrderMagicNumber()==16384)&&(OrderComment()=="priceEX"))total++; if (prevtotal-total>=1) // только что закрылся ордер - проверяем условия { ticket=GetLastOrderHist(); if (ticket>0) { if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) { if (MathAbs(OrderClosePrice()-OrderTakeProfit())<5*Point) { if (OrderType() == OP_BUY) { LimitPrice=NormalizeDouble(OrderOpenPrice()-BuyTral,Digits); ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lots,LimitPrice,5, LimitPrice-Stop*Point,LimitPrice+TakeProfit*Point, "priceEX",16384,0,Green); return; } if (OrderType() == OP_SELL) { LimitPrice=NormalizeDouble(OrderOpenPrice()+BuyTral,Digits); ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lots,LimitPrice,5, LimitPrice+Stop*Point,LimitPrice-TakeProfit*Point, "priceEX",16384,0,Green); return; } } // для else со слипажом больше 5 пунктов - что это за ордер был? } // для else совсем не срослось - ордер нашли, а выбрать не смогли :) } // для else не нашли ордера } // для else ордера не закрывались, не удалялись и не пропадали - тоже хорошо for (i=0; i<OrdersTotal(); i++) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if ((OrderSymbol()==Symbol())&&(OrderMagicNumber()==16384)&&(OrderComment()=="priceEX")) { if (OrderType() == OP_BUYLIMIT && Ask-OrderOpenPrice()>BuyTral) { LimitPrice=NormalizeDouble(Ask-BuyTral,Digits); OrderModify(OrderTicket(),LimitPrice, LimitPrice-Stop*Point,LimitPrice+TakeProfit*Point,0,Green); } if (OrderType() == OP_SELLLIMIT && OrderOpenPrice()-Bid>SellTral) { LimitPrice=NormalizeDouble(Bid+BuyTral,Digits); OrderModify(OrderTicket(),LimitPrice, LimitPrice+Stop*Point,LimitPrice-TakeProfit*Point,0,Green); } } if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if(alfa>alfaprev && total==0) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5, Ask-Stop*Point,Ask+TakeProfit*Point, "priceEX",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); //MODE_TRADES } else Print("Error opening BUY order : ",GetLastError()); return(0); } if(alfa<alfaprev && total==0) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5, Bid+Stop*Point,Bid-TakeProfit*Point, "priceEX",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); //,MODE_TRADES } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } return(0); } // the end.
Вот, типа того. Открывает покупку или продажу по индикатору. Если закрывается по тэйкпрофиту, то выставляет лимит ордера с ожиданием отката на Buy/SellTral и тралит их на таком же расстоянии.
Vita писал (а):
projectX писал (а):
Знаю что дело это неблагодарное разбираться в чужих кодах, но другой надежды у меня нет, ну не получается у меня. Я только учусь
Вот, типа того. Открывает покупку или продажу по индикатору. Если закрывается по тэйкпрофиту, то выставляет лимит ордера с ожиданием отката на Buy/SellTral и тралит их на таком же расстоянии.
Знаю что дело это неблагодарное разбираться в чужих кодах, но другой надежды у меня нет, ну не получается у меня. Я только учусь
Вот, типа того. Открывает покупку или продажу по индикатору. Если закрывается по тэйкпрофиту, то выставляет лимит ордера с ожиданием отката на Buy/SellTral и тралит их на таком же расстоянии.
Спасибо, действительно очень благодарен. Еще раз спасибо.
Я бы порекомендовал ВСЕМ начинающим прочитать “Справочник
MQL4 - Основы языка - Функции”. projectX, я надеюсь намек понятен. Если
нет, поясню, разбей код на функции, это облегчит всем понимание
твоих мыслей и сделает код красивее.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь