Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
по лонгам:
по шортам:
Вы должны заплатить денег тому, кто проверит Вашего советника. У Вас в голове каша. И в исходном тексте тоже каша.
Спрашивается, зачем Вы вызываете RefreshRates в цикле выборки ордеров и не вызываете RefreshRates в цикле модификации ордеров. Ну это так, фигня.
Я отформатировал Ваш исходный текст. Вот что получилось.
//+------------------------------------------------------------------+ //| Check_Stops.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #include <stdlib.mqh> extern int ExpertID = 916505; extern string ExpName = "000104"; extern int TPLevel = 100; // Тейк профит extern int StopLevel = 100; // SL. extern string _Parameters_b_Lots ="Параметры модуля расчёта лота"; extern double Lots = 1; // Минимальный фиксированный лот. extern int LotsWayChoice = 1; // Способ выбора рабочего лота: // 0-фиксированный, // 1-процент от депозита, extern int LotsPercent =10; extern int MaxRiskPercent =30; extern int KLots =2; extern int LotsDeltaDepo =500; extern int LotsDepoForOne =500; extern int LotsMax =10000; extern int CountTrailingMode = 3; // трал 0-отключен, 1 -NRTR, 3 - обычный, extern int UsualTrailingValue = 11; // значение обычного трала extern int MinLastProfit =5; extern int DealsCount =1; extern string Parameters_Trailing = "Параметры модуля трейлинг стопа."; extern int Profitunity= 50; extern int TryesToOpen = 1; extern int TryesToClose = 2; extern double Patr=9; extern double Prange=30; extern double Kstop=1.13; extern double kts=2; extern double Vts=1; double cnt,ValATR,hi,lo,SL,TS,prevBars, LLS=0, LSS=0; double midlot; int tryes=1; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(ExistPositions()) { if(CountTrailingMode>0) { TrailingCounting(); } } //---- if(!ExistPositions(ExpertID,1) && High[0]>High[1] && High[1]>High[2]){ OpenBuy(); } if(!ExistPositions(ExpertID,2) && Low[0]<Low[1] && Low[1]<Low[2]) { OpenSell(); } //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OpenBuy() {//1 double idLot=GetSizeLot(); int Slippage=1; double ldStop=GetStopLossBuy(); double ldTake=GetTakeProfitBuy(); string _OrderComment=ExpName; int _OrderMadic=ExpertID; int _OrderExp=0; color _Color=DeepSkyBlue; //---- if(idLot==0) { Info("1.2.3",2,""," Opening Buy were blocked by Money Management system, Current free margin is "+DoubleToStr(AccountFreeMargin(),2)+", Equity "+DoubleToStr(AccountEquity(),2)); return(0); } //---- double OpPrice = NormalizeDouble(Ask,Digits); int LastError=0; int Pause = 500; int i,i2,i3,fc; for (i2=1; i2<=TryesToOpen; i2++) {//3 if(IsTradeAllowed() || IsTesting()) {//4 Pause=Pause+Pause; fc = OrderSend(Symbol(),OP_BUY,idLot,OpPrice,Slippage,ldStop,ldTake,_OrderComment,_OrderMadic,_OrderExp,_Color); LastError = GetLastError(); if(fc<0 || LastError>0) { Info("1.2.3",1,"","ERROR OPENING BUY with Vol "+DoubleToStr(idLot,1)+" SL "+DoubleToStr(ldStop,Digits)+" TP "+DoubleToStr(ldTake,Digits)+" last try "+i2+" - "+ErrorDescription(LastError)); } else { if(fc>0) { Info("1.2.3",2,"","OPEN BUY last try "+i2+" at price "+DoubleToStr(OpPrice,Digits)+" Ticket "+fc); return(fc); } } } else { Sleep(Pause); }//4 }//3 }//2 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetSizeLot() { double dLot; //---- if (LotsWayChoice==0) dLot=Lots; // фиксированный процент от депозита if (LotsWayChoice==1){dLot=MathCeil(GetAccountFreeMargin()/10000*LotsPercent)/10;} // фракционно-пропорциональный if (LotsWayChoice==2) { int k=LotsDepoForOne; for (double i=2; i<=LotsMax; i++) { k=k+i*LotsDeltaDepo; if (k>AccountFreeMargin()) { dLot=(i-1)/10; break; } } } // 3-фракционно-фиксированный, if (LotsWayChoice==3){dLot=MathCeil((GetAccountFreeMargin()-LotsDepoForOne)/LotsDeltaDepo)/10;} //---- dLot= (MathCeil(dLot*10)/10)-Lots; if (dLot<Lots) dLot=Lots; if (dLot>LotsMax) dLot=LotsMax; Info("1.2",3,"","Counted lot is "+DoubleToStr(dLot,2)+" counting by "+LotsWayChoice+" mode"); return(dLot); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OpenSell() {//1 double idLot=GetSizeLot(); int Slippage=1; double ldStop=GetStopLossSell(); double ldTake=GetTakeProfitSell(); string _OrderComment=ExpName; int _OrderMadic=ExpertID; int _OrderExp=0; color _Color=DeepPink; //---- if(idLot==0) { Info("1.2.3",2,""," Opening Sell were blocked by Money Management system, Current free margin is "+DoubleToStr(AccountFreeMargin(),2)+", Equity "+DoubleToStr(AccountEquity(),2)); return(0); } //---- int LastError=0; int Pause = 500; double OpPrice = NormalizeDouble(Bid,Digits); int i,i2,i3,fc; for (i2=1; i2<=TryesToOpen; i2++) {//3 if(IsTradeAllowed()||IsTesting()) {//4 Pause=Pause+Pause; fc = OrderSend(Symbol(),OP_SELL,idLot,OpPrice,Slippage,ldStop,ldTake,_OrderComment,_OrderMadic,_OrderExp,_Color); LastError = GetLastError(); if(fc<0||LastError>0) { Info("1.2.3",1,"","ERROR OPENING SELL with Vol "+DoubleToStr(idLot,1)+" SL "+DoubleToStr(ldStop,Digits)+" TP "+DoubleToStr(ldTake,Digits)+" last try "+i2+" - "+ErrorDescription(LastError)); } else { if(fc>0) { Info("1.2.3",2,"","OPEN SELL last try "+i2+" at price "+DoubleToStr(OpPrice,Digits)+" Ticket "+fc); return(fc); } } } else { Sleep(Pause); }//3 }//2 }//1 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool ExistPositions(int MAGIC=0, int op=0) {//1 int i; //---- if(MAGIC !=0 && op!=0) {//2 for (i=0; i<OrdersTotal(); i++) {//3 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {//4 if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC && OrderType()== OP_BUY && op==1) {//5 Info("1.2.3",3,"","ExistPositions() found long positions "); return(True); }//5 if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC && OrderType()== OP_SELL && op==2) {//5 Info("1.2.3",3,"","ExistPositions() found short positions "); return(True); }//5 }//4 }//3 } else {//2 for ( i=0; i<OrdersTotal(); i++) {//3 if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {//4 if (OrderSymbol()==Symbol()) {//5 Info("1.2.3",3,"","ExistPositions() found "+(i+1)+" positions "); return(True); }//5 }//4 }//3 }//2 }//1 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetStopLossBuy() { return(NormalizeDouble(Bid-StopLevel*Point,Digits)); } double GetStopLossSell() { return(NormalizeDouble(Ask+StopLevel*Point,Digits)); } double GetTakeProfitBuy() { return(NormalizeDouble(Ask+TPLevel*Point,Digits)); } double GetTakeProfitSell() { return(NormalizeDouble(Bid-TPLevel*Point,Digits)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double Info(string MessageType="1,0,0", int Actuality = 1, string MessageHead="", string MessageBody="HI") {//1 }//1 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetAccountFreeMargin() { double floatProfit; floatProfit = AccountEquity()-AccountBalance(); //---- if(floatProfit>=0) {return(AccountFreeMargin());} if(floatProfit<0 && (AccountMargin()+MathAbs(floatProfit)>=(AccountBalance()/100*LotsPercent))) { return(0); } else { return(AccountFreeMargin()); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double TrailingCounting() { //---- if(CountTrailingMode==1) { //NRTR int i,mode,ticket,total; if (prevBars!=Bars) { ValATR=0; for(i=1; i<=Patr; i++) { if(i<=Patr) { ValATR+=High[i]-Low[i]; } } ValATR=ValATR/Patr; //---- hi=High[Highest(NULL,0,MODE_HIGH,Prange,Prange)]; lo=Low[Lowest(NULL,0,MODE_LOW,Prange,Prange)]; //---- if (Vts==1) {TS=kts*ValATR; SL=Kstop*ValATR;} if (Vts==2) {TS=(hi-lo); SL=Kstop*(hi-lo);} prevBars = Bars; } if (Vts<1 || Vts>2) return(0); //------------------------------------------------------- for (cnt=0; cnt<=OrdersTotal(); cnt++) { RefreshRates(); OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES); mode=OrderType(); if(OrderSymbol()==Symbol()) { //First Stop--------------------------------- if (mode==OP_BUY && OrderStopLoss() == 0) { MSL(OrderTicket(),OrderOpenPrice(),Low[0]-SL,OrderTakeProfit(),0,CLR_NONE); //PlaySound("expert.wav"); return(0); } //---- if (mode==OP_SELL && OrderStopLoss() == 0) { MSL(OrderTicket(),OrderOpenPrice(),High[0]+SL,OrderTakeProfit(),0,CLR_NONE); //PlaySound("expert.wav"); return(0); } //Main Trailing------------------------------- if ((mode==OP_BUY && High[0]-OrderOpenPrice()>TS && OrderStopLoss()<High[0]-TS) || OrderStopLoss()==0) { MSL(OrderTicket(),OrderOpenPrice(),High[0]-TS,OrderTakeProfit(),0,CLR_NONE); //PlaySound("expert.wav"); return(0); } //---- if ((mode==OP_SELL && OrderOpenPrice()-Low[0]>TS && OrderStopLoss()>Low[0]+TS) || OrderStopLoss()==0) { MSL(OrderTicket(),OrderOpenPrice(),Low[0]+TS,OrderTakeProfit(),0,CLR_NONE); //PlaySound("expert.wav"); return(0); } } return(0); } } //---- if(CountTrailingMode==3) { // Usual mode for ( i=0; i<OrdersTotal(); i++) { RefreshRates(); if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==ExpertID) { if (OrderType()==OP_BUY) { if (Bid-OrderOpenPrice()>UsualTrailingValue*Point) { if (OrderStopLoss()<Bid-UsualTrailingValue*Point) { Print(StringConcatenate("********",OrderStopLoss()," ",Bid-(UsualTrailingValue*Point))); MSL(OrderTicket(),OrderOpenPrice(),(Bid-(UsualTrailingValue*Point)),OrderTakeProfit(),0,CLR_NONE); } } } } } } //---- for ( i=0; i<OrdersTotal(); i++) { RefreshRates(); if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==ExpertID) { if (OrderType()==OP_SELL) { if (OrderOpenPrice()-Ask>(UsualTrailingValue*Point)) { if (OrderStopLoss()>(Ask+(UsualTrailingValue*Point))) Print(StringConcatenate("Short Stops ",OrderStopLoss()," New Stops ",(Ask+(UsualTrailingValue*Point)))); MSL(OrderTicket(),OrderOpenPrice(),Ask+(UsualTrailingValue*Point),OrderTakeProfit(),0,CLR_NONE); } } } } } } //---- return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double ND(double D,int Dig) { return(NormalizeDouble(D,Dig)); } double SD(string S) { return(StrToDouble(S)); } int SI(string S) { return(StrToInteger(S)); } int SL(string S) { return(StringLen(S)); } string STRL(string S) { return(StringTrimRight(StringTrimLeft(S))); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void MSL(int _OTicket, double _OOpenPrice, double _OStopLoss, double _OTakeProfit, datetime _OExpiration=0 , color _AColor = DeepPink) { int i, Pause = 500; int LastError=0; bool fm=true; //---- for (i=0; i<tryes; i++) { Pause = Pause+Pause; fm = OrderModify(_OTicket,_OOpenPrice,_OStopLoss,_OTakeProfit,_OExpiration,_AColor); if(!fm) { LastError=GetLastError(); if(LastError>0) {Info("1.2.3",1,"","There was an ERROR while order modify "+ErrorDescription(LastError)+" at "+i+" try."); } Sleep(Pause); } if(fm) { Info("1.2",2,"","Order "+_OTicket+" Succesfully Modifyied at "+i+" try."); break; } } //---- } //+------------------------------------------------------------------+Ответ лежит на поверхности.
Вот кусок кода модификации длинных позиций
if (OrderType()==OP_BUY) { if (Bid-OrderOpenPrice()>UsualTrailingValue*Point) { if (OrderStopLoss()<Bid-UsualTrailingValue*Point) { Print(StringConcatenate("********",OrderStopLoss()," ",Bid-(UsualTrailingValue*Point))); MSL(OrderTicket(),OrderOpenPrice(),(Bid-(UsualTrailingValue*Point)),OrderTakeProfit(),0,CLR_NONE); } } }Вот кусок кода модификации коротких позиций
if (OrderType()==OP_SELL) { if (OrderOpenPrice()-Ask>(UsualTrailingValue*Point)) { if (OrderStopLoss()>(Ask+(UsualTrailingValue*Point))) Print(StringConcatenate("Short Stops ",OrderStopLoss()," New Stops ",(Ask+(UsualTrailingValue*Point)))); MSL(OrderTicket(),OrderOpenPrice(),Ask+(UsualTrailingValue*Point),OrderTakeProfit(),0,CLR_NONE); } }Видите разницу?
Спрашивается, зачем Вы вызываете RefreshRates в цикле выборки ордеров и не вызываете RefreshRates в цикле модификации ордеров. Ну это так, фигня.
пробовал конечно, это проблему никак не решало.
Видите разницу?
за исключением по-другому расставленных скобок разницы никакой :))
Slawa судя по логам, код функций трейлингования и модификации ордеров рабочий!
проблема в том что после того как по сигналу функции TrailingCounting() функция MSL() передвигает как положено стоп. прога не обращая внимания на код советника продолжает двигать стоп за ценой вверх вниз хотя этого быть не должно т.к. вот эти условия для шортов:
а вот эти для лонгов:
явно предусматривают перемещение стопов только в сторону увеличения профита!!!
еще вызывает небольшое подозрение такая ситуация когда OrderModify() возвращает false а код ошибки при этом = 0 т.е. нет ошибки эт как? в течении 5 попыток OrderModify() не срабатывает и ошибки не возвращает
if (OrderType()==OP_SELL) { if (OrderOpenPrice()-Ask>(UsualTrailingValue*Point)) { if (OrderStopLoss()>(Ask+(UsualTrailingValue*Point))) Print(StringConcatenate("Short Stops ",OrderStopLoss()," New Stops ",(Ask+(UsualTrailingValue*Point)))); MSL(OrderTicket(),OrderOpenPrice(),Ask+(UsualTrailingValue*Point),OrderTakeProfit(),0,CLR_NONE); } }Print отрабатывает по условию, а Ваша функция MSL в любом случае
Надо бы вот так сделать:
if (OrderType()==OP_SELL) { if (OrderOpenPrice()-Ask>(UsualTrailingValue*Point)) { if (OrderStopLoss()>(Ask+(UsualTrailingValue*Point))) { Print(StringConcatenate("Short Stops ",OrderStopLoss()," New Stops ",(Ask+(UsualTrailingValue*Point)))); MSL(OrderTicket(),OrderOpenPrice(),Ask+(UsualTrailingValue*Point),OrderTakeProfit(),0,CLR_NONE); } } }Опять не видите разницу?
Рекомендуется ли всегда делать RefreshRates( ) перед выполнением торговых функций, MarketInfo( OrderSymbol( ), MODE_BID ), MarketInfo( OrderSymbol( ), MODE_ASK ) ?
Заметила, что без RefreshRates( ) зацикленные скрипты плохо получают котировки.
Из каких соображений следует выбирать время задержки для void Sleep( int milliseconds) ?
Спасибо.
При долговременной работе эксперта, когда ценовые данные меняются, необходимо вызывать перед торговой операцией. (Например, почитайте "MQL4: Ошибки исполнения")
Скрипты могут получить самые свежие ценовые данные ("свои" Open[], High[], Low[], Close[], Time[], Volume[], Bars, Bid, Ask) только с помощью RefreshRates. Получение отдельных данных при помощи MarketInfo, либо ценовых данных другого символа/периода не требует вызова функции RefreshRates.
Время задержки между чем и чем? Если между торговыми операциями, то органолептически, чтобы не досадить брокера слишком частыми запросами.
Большое спасибо за обстоятельный ответ.
Из каких соображений следует выбирать время задержки void Sleep( int milliseconds) для зацикленных скриптов ?
Зацикленные скрипты, продолжающие работать при переключении периода - это фантастика ? Очень бы хотелось.
Здесь есть нюансы. При смене таймфрейма зацикленный скрипт как можно скорее должен закончить свою работу и выполнить функцию deinit. После смены таймфрейма конечно же надо будет запустить функцию init и сразу start. С какого места, с начала или с прерванного? "И того, и другого, и можно без хлеба" (ц)
Скрипты изначально задумывались как одноразовые утилиты, всей рутинной работой должны заниматься эксперты.