Почему мой советник продолжает давать отрицательную прибыль при обратном тестировании? - страница 4
Вы упускаете торговые возможности:
        - Бесплатные приложения для трейдинга
 - 8 000+ сигналов для копирования
 - Экономические новости для анализа финансовых рынков
 
          Регистрация
          Вход
        
        Вы принимаете политику сайта и условия использования
    Если у вас нет учетной записи, зарегистрируйтесь
  
Это мой последний код. не могу придумать ничего плохого, кроме того, что он не дает мне нужных результатов.
//+------------------------------------------------------------------+ //| RSI_strategy_cyxstudio.mq4 | //| Copyright 2013, Tjipke de Vries | //| https://forum.mql4.com/53695/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #include <stderror.mqh> #include <stdlib.mqh> extern int RSIPeriod = 2; //number of periods for RSI extern double UpperBound = 95; //set upper bound value for RSI extern double LowerBound = 5; //set lower bound value for RSI extern double Lots = 0.1; extern double StopLoss = 60; //Set the stop loss level extern double TakeProfit = 120; //Set the take profit level extern double TrailingStop = 40; //extra settings for OrderSend extern int MagicNumber = 54333; extern string CommentEA = "RSI strategy"; extern int Slippage.Pips = 3; //--- //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Alert(OrdersTotal()); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int Ticket1; int Ticket2; bool Ticket3; bool Ticket4; double SL,TP; int Total; double MagicNo; double Slippage; int cnt; double pAsk = MarketInfo(Symbol(), MODE_ASK); double pBid = MarketInfo(Symbol(), MODE_BID); double MA200 = iMA(NULL, 1440, 200, 0,MODE_SMA,PRICE_CLOSE, 0); //200 day Moving Average double MA5 = iMA(NULL, 1440, 5, 0,MODE_SMA,PRICE_CLOSE, 0); // 5 day Moving Average double CurrentRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,0); double PrevRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,1); double LastRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,2); if(Bars<100) { Print("bars less than 100"); return(0); } if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //Check for open orders if there are none then check for conditions to open one if (OrdersTotal() ==0 && LastRSI > PrevRSI && PrevRSI > CurrentRSI && CurrentRSI < LowerBound && pAsk > MA200) { //Condition to execute buy entry Ticket1 = OrderSend(Symbol(), OP_BUY, Lots, pAsk, Slippage.Pips, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", MagicNumber,0,Yellow); //execute buy order if(Ticket1>0) { if(OrderSelect(Ticket1,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } if (Ticket1 < 0) { Print("Error opening BUY order : ",GetLastError()); return(0); } if (OrdersTotal() ==0 && LastRSI < PrevRSI && PrevRSI < CurrentRSI && CurrentRSI > UpperBound && pBid < MA200) { //Condition to execute sell entry Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, Slippage.Pips, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",MagicNumber, 0, Yellow) ; //execute sell order if(Ticket2>0) { if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } if (Ticket2<0) { Print("Error opening SELL order : ",GetLastError()); return(0); } } } int ticket=OrderTicket(); double lots=OrderLots(); for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if (OrderType() == OP_BUY && pBid > MA5) { Ticket3 = OrderClose(ticket, lots, pBid, Slippage.Pips); if (Ticket3 == true ) { Print("BUY position closed", OrderClosePrice()); } if (Ticket3 == false) { Print("Error closing BUY position", ErrorDescription(GetLastError())); } } if (OrderType() == OP_SELL && pBid < MA5) { Ticket4 = OrderClose(ticket, lots, pAsk, Slippage.Pips); if (Ticket4 == true ) { Print("SELL position closed", OrderClosePrice()); } if (Ticket4 == false) { Print("Error closing SELL position", ErrorDescription(GetLastError())); } } } } } return(0); }Если вы посмотрите на страницу 2 этой темы, вы сможете найти то, что я вам дал
Вот здесь begin.....
Дайте свой комментарий ..... о том, что отличается от вашего до сих пор...
Затем прочитайте https://www.mql5.com/en/forum/139654 и попробуйте сделать цикл, отсчитывающий время проверки сделок.
Как вы видите, я попросил сделать цикл с обратным отсчетом, проверяющий сделки.
Это мой следующий шаг внутри кода.
Я прошу вас только об этой части кода
чтобы он считал сделки на покупку и продажу отдельно.
Если вы посмотрите на страницу 2 этой темы, вы сможете найти то, что я вам дал
Я удалил его, потому что не знал, как его использовать. Вы дали мне код частично, но я не мог понять, как он работает.
--
Вот здесь begin.....
Дайте свой комментарий ..... о том, что отличается от вашего до сих пор...
Затем прочитайте https://www.mql5.com/en/forum/139654 и попробуйте сделать цикл, отсчитывающий время проверки сделок.
Как вы можете видеть, я попросил сделать цикл, отсчитывающий время проверки сделок.
Это мой следующий шаг внутри кода.
Я прошу вас только об этой части кода
чтобы он считал сделки на покупку и продажу отдельно.
вот так?
int ticket=OrderTicket();//блоки кодов для выполнения
}
Я удалил его, потому что не знал, как его использовать. Вы дали мне код частично, я не мог видеть, как он функционирует.
В момент, когда советник запускается снова
BUYS устанавливается на 1
SELLS - 1
OrdersTotal() дает общее количество всех открытых сделок на вашем счете.
Он может быть равен нулю, тогда у нас нет открытых сделок и нам не нужно проверять, есть ли сделки этого советника.
ЕслиOrdersTotal() > 0 BUYS остается 1 и SELLS остается 1
в этом случае нам нужно проверить, не от нашего ли это советника, и мы должны подсчитать различные типы (buy, sell, buylimit....).
так что
вот так?
int ticket=OrderTicket();//блоки кодов для выполнения
}
Использовать кнопку SRC
Этот цикл мы только запускаем (для какого условия).
Как вы узнаете, что выбранная сделка в цикле - это покупка или продажа?
И как вы их считаете?
Использовать кнопку SRC
Этот цикл мы только запускаем (для какого условия).
Как вы узнаете, что выбранная сделка в цикле - это покупка или продажа?
И как вы их считаете?
опс.
if (OrderType() == OP_BUY && pBid > MA5) { Ticket3 = OrderClose(ticket, lots, pBid, Slippage.Pips); if (Ticket3 == true ) { Print("BUY position closed", OrderClosePrice()); } if (Ticket3 == false) { Print("Error closing BUY position", ErrorDescription(GetLastError())); } } if (OrderType() == OP_SELL && pBid < MA5) { Ticket4 = OrderClose(ticket, lots, pAsk, Slippage.Pips); if (Ticket4 == true ) { Print("SELL position closed", OrderClosePrice()); } if (Ticket4 == false) { Print("Error closing SELL position", ErrorDescription(GetLastError())); } } }для функции закрытой сделки.
используя
if (OrderType() == OP_SELL && pBid < MA5)для разграничения покупки и продажи.
Есть ли что-то неправильное в моих условиях для открытия ордера?
Должен ли я удалить его и заменить циклом, который я использовал для функции закрытия ордера?
опс.
для функции закрытой торговли.
использование
для разграничения покупки и продажи.
Есть ли что-то неправильное в моих условиях для открытия ордера?
Должен ли я удалить его и заменить циклом, который я использовал для функции закрытия ордера?
В данный момент вы должны проверить, есть ли уже открытая сделка.
Прежде чем открывать сделку, вы должны знать, открыта ли сделка.
Я все еще не вижу, что вы сделали подсчет сделок.
.
Посмотрите на код советника Moving Average на вашей станции metatrader и посмотрите, как это делается там .....