However, It does not close my open orders
//+------------------------------------------------------------------+ //| functiontest.mq4 | //| function testing | //| Function Testing | //+------------------------------------------------------------------+ #property copyright "Open Function Testing" //---- input parameters extern double LotSize=0.1; extern int TakeProfit=20; extern int StopLoss=10; extern int AB_distance=10; extern int MagicNumber=123486; //+++++ user can change retrace and/or extension: extern double fibo_retrace=0.500; //Got something screwed up here extern double fibo_extension=0.618; //Got to fix this too //reference: http://www.forexfibonacci.com/calculate_fibonacci_levels/04/ double val1; double val2; //+------------------------------------------------------------------+ //| put custom functions here first | //+------------------------------------------------------------------+ //++++ These are adjusted for 5 digit brokers. int pips2points; // slippage 3 pips 3=points 30=points double pips2dbl; // Stoploss 15 pips 0.0015 0.00150 double mlots = AB_distance*10; //A to B distance normalizer // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { if (Digits == 5 || Digits == 3) { // Adjust for five (5) digit brokers. pips2dbl = Point*10; pips2points = 10; } else { pips2dbl = Point; pips2points = 1; } // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { static datetime PreviousTime=0; if(PreviousTime==Time[0]) return(0); else PreviousTime=Time[0]; // Should prevent another this bar if it runs through and returns back to the top of start. macdclosetrade(); macdsignaltrade(); //+------------------------------------------------------------------+ //| end start function | //+------------------------------------------------------------------+ return(0); } //+------------------------------------------------------------------+ //| My Functions (testing) | //+------------------------------------------------------------------+ void macdsignaltrade() { double faster=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);//MODE_MAIN double slower=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL double prevfaster=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);//MODE_MAIN previous faster double prevslower=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2); //MODE_SIGNAL previous slower //make one for shift 3 and 4 to evaluate the fractals if(prevfaster < prevslower && faster > slower)OrderEntry(0); //Print(" MACD UP"); if(prevfaster > prevslower && faster < slower)OrderEntry(1); //Print(" MACD DOWN"); } void engulfingsignal() //Bullish Engulfing Candle { if(Open[2] > Close[2] //bear candle identified && Open[1] < Close[1] //bull candle identified && Open[1]<= Close[2] //bull engulfing condition && Open[2] < Close[1]) Print(Close[1]," Bullish Engulfing Candle "," and engulfingsize = ",DoubleToStr(Close[1]-Open[1],Digits)); //DoubleToStr( Close[1]-Open[1],Digits) forums help if(Open[2]<Close[2]//bull candle identified && Open[1]>Close[1]//bear candle identified && Open[1]>= Close[2] //bear engulfing condition && Open[2] > Close[1]) Print(Close[1]," Bearish Engulfing Candle "," and engulfingsize = ",DoubleToStr(Close[1]-Open[1],Digits)); //DoubleToStr( Close[1]-Open[1],Digits) forums help); } void martingale() { //future function // to double lot sizes each time a trade loses } int fractaltrade() { //future function // needs to determine the ABDC's and trade entries return(0); } void macdclosetrade() { double faster=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);//MODE_MAIN double slower=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); //MODE_SIGNAL double prevfaster=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);//MODE_MAIN previous faster double prevslower=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2); //MODE_SIGNAL previous slower for(int i = OrdersTotal()-1; i >= 0 ; i--) int result; { if(OrderSelect(i, SELECT_BY_POS)) if(OrderMagicNumber() == MagicNumber) if(OrderSymbol()== Symbol()) if(OrderType() == OP_BUY) if(prevfaster > prevslower && faster < slower) //if direction goes down on a buy order then close the order { result = OrderClose(OrderTicket(), OrderLots(), Bid, 3*pips2points, Blue); if(result == false) Print("Order",OrderTicket(),"failed to close Error",GetLastError()); Print(" MACD DOWN CLOSE"); } if(OrderType() == OP_SELL) if(prevfaster < prevslower && faster > slower) //if direction goes up on a sell order then close the order { result = OrderClose(OrderTicket(), OrderLots(), Bid, 3*pips2points, Blue); if(result == false) Print("Order",OrderTicket(),"failed to close Error",GetLastError()); Print(" MACD UP CLOSE"); } } } //end macdclosetrade() int OrderEntry(int direction) { int ticket; if(direction==0) if(OrdersTotal()==0) ticket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,3*pips2points,Ask-(StopLoss*pips2dbl),Ask+(TakeProfit*pips2dbl),NULL,MagicNumber,0,Green); if(ticket<0) Alert("OrderSend Failed: ", GetLastError()); if(direction==1) if(OrdersTotal()==0) ticket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,3*pips2points,Bid+(StopLoss*pips2dbl),Bid-(TakeProfit*pips2dbl),NULL,MagicNumber,0,Green); if(ticket<0) Alert("OrderSend Failed: ", GetLastError()); return(0); } //+------------------------------------------------------------------+
Так и не разобрался. Написал 4 советника с разными тралами. У всех в тесте ошибка 130. Не знаю почему она возникает и как сделать так, чтобы ее не было. Еще трал по фракталам вроде работает, но когда тестируешь с визуализацией — тест дальше первой сделки не идет( отрывается первый ордер и все, дальше никаких признаков жизни). А трала по pSAR заметил такую вещь. Советник открыл БАЙ, но цена тут же пошла вниз. А значения то индикатора получается сверху свечи, то есть стоплосс не может быть больше текущей цены. И у нас открыта позиция на долгое время без стоплосса. На скрине отметил это красной стрелкой. Подскажите как быть в данной ситуации?
Вот поправленный трал с фракталами:
void Trailing()
{
SL = 0;
fractal_down = NormalizeDouble(iFractals(NULL,0,MODE_LOWER,5),Digits);
fractal_up = NormalizeDouble(iFractals(NULL,0,MODE_UPPER,5),Digits);
for (int i =0;i {
if (OrderSelect(i,SELECT_BY_POS))
{
if (OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic)
if (OrderType()==OP_BUY)
{
if(fractal_down>0)
{
SL=NormalizeDouble(fractal_down,Digits);
if (OrderStopLoss()!=SL)
{
if(SL bool rez = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
if (OrderType()==OP_SELL)
{
if(fractal_up>0)
{
SL=NormalizeDouble(fractal_up,Digits);
if (OrderStopLoss()!=SL)
{
if(SL > Ask + MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)
bool rez = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
} }
}
Ошибка 130 — это неправильные стопы.Возможно просто стоп-лосс который Вы хотите разместить находится слишком близко
от текущей цены.
Сделайте проверку
if(SL > Ask + MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)
Изменено 4 августа, 2015 пользователем Konstebl
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 Counted_bars; // Количество просчитанных баров
Counted_bars=IndicatorCounted(); // Количество просчитанных баров
int i=Bars-Counted_bars-1; // Индекс первого непосчитанного
if (i>History-1) // Если много баров то ..
i=History-1; // ..рассчитывать заданное колич.
while(i>=0) // Цикл по непосчитанным барам
{
double MA_l_0 = iMA(NULL,0,perMA_1,0,modeMA_1,PRICE_CLOSE,i);
double MA_l_1 = iMA(NULL,0,perMA_1,0,modeMA_1,PRICE_CLOSE,i+1);
double MA_g_0 = iMA(NULL,0,perMA_2,0,modeMA_2,PRICE_CLOSE,i);
double MA_g_1 = iMA(NULL,0,perMA_2,0,modeMA_2,PRICE_CLOSE,i+1);
double STD_0 = iStdDev(NULL,0,perSTD,0,modeSTD,PRICE_CLOSE,i);
double STD_1 = iStdDev(NULL,0,perSTD,0,modeSTD,PRICE_CLOSE,i+1);
//double ELR_1=((High[i]+Low[i])/2)-iMA(NULL,0,perELR,0,1,PRICE_CLOSE,i);
//double ELR_2=((High[i]+Low[i])/2)-iMA(NULL,0,perELR,0,1,PRICE_CLOSE,i+1);
//Buy
if(MA_l_0 > MA_l_1 &&
MA_g_0 > MA_g_1 &&
STD_0 > STD_1)
if(Hour() < 9 || Hour() > 20) UPBuffer[i] = 0;
else UPBuffer[i] = Low[i];
else
//Sell
if(MA_l_0 < MA_l_1 &&
MA_g_0 < MA_g_1 &&
STD_0 > STD_1 )
if(Hour() < 9 || Hour() > 20) DNBuffer[i] = 0;
else DNBuffer[i] = High[i];
i--;
}
//--- return value of prev_calculated for next call
return(rates_total);
}
Блог им. andresh
- 10 июня 2014, 16:55
- |
- Андрэ
-
попробовал запустить советник в МТ4 на MQL4:
extern int H = 14;
extern int M = 25;
int start()
{
if(OrdersTotal()==0 && Hour( )==H && Minute( ) ==M)
OrderSend(«USDJPY», OP_SELL,0.1,Bid,0,Ask+200*Point,Ask-200*Point,»»,123,0,Red);
}
и никак не могу разобраться, чего не хватает. ошибок нет, но есть 2 предупреждения:
return value of ‘OrderSend’ should be checked
not all control paths return a value
не могу понять, что ещё нужно… Пожскажите пожалуйста, а?
- Ключевые слова:
- MQL4,
- советники
- хорошо
-
0
25 комментариев
- 10 июня 2014, 17:08
- Ответить
Язык недавно сильно переработали, возможно поэтому.
- 10 июня 2014, 17:11
- Ответить
The0bald, пасип. да туповат я, видимо. не могу там найти. ща ещё раз попробую.)
- 10 июня 2014, 17:13
- Ответить
5й параметр — проскальзывание может добавить, чтобы больше нуля.
а если это весь код то должен быть последним оператор return(0);
- 10 июня 2014, 17:12
- Ответить
Бартоломей Цигенбальг, Ура, второе замечание исчезло!!! Осталось только: return value of ‘OrderSend’ should be checked
- 10 июня 2014, 17:14
- Ответить
Андрэ, это про return. про 5-й параметр соображаю…
- 10 июня 2014, 17:15
- Ответить
Бартоломей Цигенбальг, это про return. про 5-й параметр соображаю… не поясните?
- 10 июня 2014, 17:16
- Ответить
так красивее и все всех устраивает )))
проскальзывание дает шанс открыться по рынку при худшей цене на заданное отклонение именно этим параметром.
- 10 июня 2014, 17:17
- Ответить
Бартоломей Цигенбальг, ух ты!!! ошибок нет! Спасибо большое! )))) буду ковыряться дальше! )
- 10 июня 2014, 17:24
- Ответить
Андрэ, не совсем правильно в коде, потому что он за минуту пока удовлетворяет условиям может кучу ордеров наоткрывать )))
- 10 июня 2014, 17:26
- Ответить
не не норм. там есть проверка на количество открытых ордеров
- 10 июня 2014, 17:35
- Ответить
Бартоломей Цигенбальг, тоже присмотрелся, сообразил! )))) спасибо огромное! плюсануть не могу, плюсовалка не позволяет)
- 10 июня 2014, 17:37
- Ответить
имхо, лучше с mql5 начать изучение. 4 недавно сильно переделали — книга не актуальна, справка не доделана, не понятно какие функции заменили на аналог из мт5 какие старые оставили, косяки наверняка есть после серьезной переработки.
- 10 июня 2014, 17:44
- Ответить
The0bald, логично, НО, эти советники на МТ4 не работают, насколько я знаю. это придётся и платформу менять, а не хотелось бы.
- 10 июня 2014, 17:46
- Ответить
Андрэ, На новой МТ4 старые исходники все равно придется переделывать.
- 10 июня 2014, 18:24
- Ответить
The0bald, возможно. просто у меня сейчас 2 робота на МТ4 работают, я доволен. вот, взялся сам изучать роботописательство. пока я «БЛИЖЕ» к МТ4. ) вы пишете сами? успешно?
- 10 июня 2014, 18:28
- Ответить
Андрэ, Пишу давно, правда индикаторы в основном
- 10 июня 2014, 18:30
- Ответить
The0bald, Привет, можно обращятся с просьбой по поводу mql если не трудно?
- 10 июня 2014, 21:00
- Ответить
нужно посмотреть на один индюк, выдает сигнал не всегда а нужно чтобы всегда выдал, если вам удобно можно в скайп общятся, мой скайп dimii1000
- 10 июня 2014, 22:17
- Ответить
в личку не могу писать, рейтинга не хватает (( я тут больше читатель, почту оставьте если не трудно, моя почта trader-profit@mail.ru
- 10 июня 2014, 22:42
- Ответить
- 10 июня 2014, 22:53
- Ответить