когда вы запускаете Metatrader, советник должен выяснить, открыта ли сделка.
Я делаю только цикл обратного отсчета для проверки сделок, если есть сделка.
Если я устанавливаю в начале на 1 и OrdersTotal() >0, то я делаю проверку сделок if(.......> || .......> ){делаю цикл....
Вы уверены, что дали мне код, который дал вам результаты, показанные выше? Я протестировал его на периоде 1440 (1 день) и ни одна сделка не была выполнена. однако когда я изменил его на 1M, многие сделки были выполнены.
cyxstudio: вы уверены, что дали мне код, который дал вам результаты, показанные выше? я тестировал его на периоде 1440 (1 день) и ни одна сделка не была выполнена. однако когда я изменил его на 1M, многие сделки были выполнены
Если вы снова проверите мой тест, вы найдете период теста и таймфрейм, на котором он тестировался.
Как вы можете видеть, эта установка сдвига не существует на RSI... она отображается в собственном окне. Это подсказка.
Если вы поместите скользящую среднюю на свой график, вы увидите, что соответствует Ma_Shift в качестве настройки в окне Shift.
Также обратите внимание на порядок параметров 200,8,sma,close. при вызове индикатора.
порядок, в котором они указаны в поле... NULL и таймфрейм - это то, на что вы опускаете Ma.
поэтому они здесь не нужны. также как и установка последнего сдвига... так как эта ma будет постоянно меняться на текущей свече.
Вы поймете это через мгновение.
если вы посмотрите на настройки индикатора iAlligator, то увидите настройки для сдвига челюсти, сдвига зубов и сдвига губ... это MaShift каждой из этих скользящих средних.
Все они могут быть сдвинуты на графике влево или вправо на сколько угодно баров.
что отображается следующим образом............
Это делает разницу в 3 пункта в значении на этой свече 08:00, как показано здесь в окне данных.
Что приводит нас к вопросу: для чего нужна настройка "Shift" в конце?
Когда вы наводите курсор на график с открытым окном данных и перемещаетесь от свечи к свече.
вы увидите, как меняются цифры для 5 SMA при переходе от свечи к свече...
Именно в этом и заключается последнее значение SHIFT... помня о том, что текущая свеча, которая сейчас рисуется.
это нулевая свеча... последняя завершенная свеча - это свеча 1, так что если на вашем графике 1000 свечей, то они нумеруются в обратном порядке.
они нумеруются в обратном порядке от 999 на левом краю вашего графика до 0, где вы находитесь в данный момент.
Таким образом, если вы хотите узнать, какое значение 5 SMA было 5 завершенных свечей назад.
вы ставите 5 в этом последнем месте... конечно, с течением времени свеча 5 будет меняться на следующую свечу.
Теперь, как было сказано, если вы всегда получаете значение свечи 0... то это значение постоянно
меняется вместе с ценой. Поэтому вы можете принять сигнал, и тогда индикатор перерисует вас... но если вы
всегда запрашиваете информацию от свечи 1, то это уже сделано и не изменится.
Я все переделал, исправил петлю, проскальзывание, исправил значения скользящей средней и RSI, убедился, что все открытые позиции закрываются перед началом новой позиции. но когда я тестирую его, ничего не происходит, ни покупка, ни продажа не выполняются... в чем проблема?
Функция init() запускается только при старте, а не на каждом тике, как функция start(). Вам нужно вернуть скользящие средние в функцию start, а не в init(), чтобы она работала и получала свежие числа...
Добавьте функцию, при которой советник будет проверять наличие отложенных ордеров перед тем, как принять решение об открытии новой позиции. Если есть отложенный или открытый ордер, то он не будет пытаться открыть новую позицию.at
Я вижу, что все используют цикл для проверки наличия открытых позиций перед покупкой, я не вижу в этом логики. пока OrdersTotal > 0, есть открытые ордера, и мой советник не будет пытаться открыть больше позиций.
Исправил убывающий цикл.
На этот раз он выдает ошибку OrderClose 138, которая не решается добавлением refreshrates().
и я все еще теряю деньги, чего не должно быть.
Я не могу придумать, что еще можно исправить...
//+------------------------------------------------------------------+//| 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"externint RSIPeriod = 3; //number of periods for RSIexterndouble UpperBound = 90; //set upper bound value for RSIexterndouble LowerBound = 5; //set lower bound value for RSIexternint MASlowPeriod = 200;
externint MAFastPeriod = 5;
externdouble Lots = 0.1;
externdouble StopLoss = 60; //Set the stop loss levelexterndouble TakeProfit = 120; //Set the take profit levelexterndouble TrailingStop = 40;
//extra settings for OrderSendexternint MagicNumber = 54333;
externstring CommentEA = "RSI strategy";
externint Slippage.Pips = 3;
int BUYS=1,SELLS=1;
//++++ These are adjusted for 5 digit brokers.int pips2points; // slippage 3 pips 3=points 30=pointsdouble pips2dbl; // Stoploss 15 pips 0.015 0.0150intDigits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips)//---//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init()
{
//---- if(Digits % 2 == 1) // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
{pips2dbl = Point*10; pips2points = 10; Digits.pips = 1;}
else {pips2dbl = Point; pips2points = 1; Digits.pips = 0;}
// OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl //---- //----return(0);
}
//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit()
{
//----//----return(0);
}
//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start()
{
//----int Ticket;
double SL,TP;
int Total;
double MagicNo;
double Slippage;
double pAsk = MarketInfo(Symbol(), MODE_ASK);
double pBid = MarketInfo(Symbol(), MODE_BID);
double MA200 = iMA(NULL, 0, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0); //200 day Moving Average double MA5 = iMA(NULL, 0, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0); // 5 day Moving Averagedouble CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
int Ticket2;
int cnt;
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (OrdersTotal() == 0 ) {
if (CurrentRSI < LowerBound && pAsk > MA200) { //Condition to execute buy entry
Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow) ; //execute buy orderif(Ticket>0)
{
if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
if (Ticket < 0) {
Print("Error opening BUY order : ",GetLastError());
return(0);
}
}
if (CurrentRSI > UpperBound && pBid < MA200) { //Condition to execute sell entry
Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, 3, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",000, 0, Yellow) ; //execute sell orderif(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);
}
}
}
if (OrdersTotal() > 0 ) {
int PositionIndex; // <-- this variable is the index used for the loopint TotalNumberOfOrders; // <-- this variable will hold the number of orders currently in the Trade pool
TotalNumberOfOrders = OrdersTotal(); // <-- we store the number of Orders in the variablefor(PositionIndex = TotalNumberOfOrders - 1; PositionIndex >= 0 ; PositionIndex --) // <-- for loop to loop through all Orders . . COUNT DOWN TO ZERO !
{
RefreshRates();
if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue; // <-- if the OrderSelect fails advance the loop to the next PositionIndexif( OrderMagicNumber() == MagicNo // <-- does the Order's Magic Number match our EA's magic number ?
&& OrderSymbol() == Symbol() // <-- does the Order's Symbol match the Symbol our EA is working on ?
&& ( OrderType() == OP_BUY // <-- is the Order a Buy Order ?
|| OrderType() == OP_SELL ) ) // <-- or is it a Sell Order ?if (pAsk > MA5){ //condition to close long position
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),pBid,3,Violet); // close long positionreturn(0); // exitif(TrailingStop>0)
{
if(pBid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<pBid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),pBid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
if(pBid < MA5){ //condition to close short position
RefreshRates();
OrderClose(OrderTicket(),OrderLots(),pAsk,3,Violet); // close short positionreturn(0); // exitif(TrailingStop>0)
{
if((OrderOpenPrice()-pAsk)>(Point*TrailingStop))
{
if((OrderStopLoss()>(pAsk+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),pAsk+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) ) // <-- try to close the orderPrint("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() ); // <-- if the Order Close failed print some helpful information
} // end of For loop
}
return(0);
}
Добавьте функцию, при которой советник будет проверять наличие отложенных ордеров, прежде чем принять решение об открытии новой позиции. Если есть отложенный или открытый ордер, то он не будет пытаться открыть новую позицию.at
Я вижу, что все используют цикл для проверки наличия открытых позиций перед покупкой, я не вижу в этом логики. пока OrdersTotal > 0, есть открытые ордера, и мой советник не будет пытаться открыть больше позиций.
Исправил убывающий цикл.
На этот раз он выдает ошибку OrderClose 138, которая не решается добавлением refreshrates().
и я все еще теряю деньги, чего не должно быть.
Я не могу придумать, что еще можно исправить...
Почему вы разместили логику для открытия покупки до того, как проверили сделки, открытые вашим советником на вашем счете ????.
Что произойдет сейчас ???? с тем программированием, которое у вас есть на данный момент?
Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.
Сколько сделок в OrdersTotal() с этой сделкой?
Ваш код.... для BUY
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (OrdersTotal() == 0 ) {
if (CurrentRSI < LowerBound && pAsk > MA200) { //Condition to execute buy entry
Ticket = OrderSend(Symbol(), OP_BUY, Lots, pAsk, 3, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", 111,0,Yellow) ; //execute buy orderif(Ticket>0)
{
if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
if (Ticket < 0) {
Print("Error opening BUY order : ",GetLastError());
return(0);
}
что он делает сейчас??? и по какой причине он это делает????
Вам там очень хорошо помогли(RaptorUK и WHRoeder спасибо за объяснения, я думаю очень хорошо сделано)
.
У меня к вам еще один вопрос
Почему вы изменили таймфрейм при расчете скользящей средней?
Это не то же самое, что я дал,
Он не вычисляет правильное значение на другом графике Daily
.
Поэтому уделите время обучению и практике и внимательно читайте помощь, которую вы получаете здесь, на этом форуме.
или вы платите кому-то, чтобы программировать для вас на сайте типа Jobs.
OrdersTotal() должна показывать общее количество отложенных ордеров и рыночных ордеров, независимо от того, были они открыты советником или вручную?
Я думал об этом следующим образом. Мой советник всегда проверяет, есть ли открытые ордера, и если есть, то он больше не будет открывать ордера, и он будет открывать новые ордера только тогда, когда нет открытых ордеров, следовательно.
if (OrdersTotal() == 0 )
Я думаю, что советник работает нормально, потому что в разделе результатов отображается последовательность ордеров 1,1,2,2,3,3,4,4, что означает, что ордер закрыт до открытия нового ордера.
переменные для скользящей средней и RSI были изменены по причинам тестирования. Я экспериментировал на разных временных рамках/периодах, но не изменил их обратно, когда разместил здесь.
И самое странное, мой код исполняет ТОЛЬКО ордер на покупку. Он никогда не исполнял даже один... ордер на продажу. Это просто странно,
В двух словах, проблемы, с которыми я все еще сталкиваюсь сейчас.
1. он исполняет только buy, но никогда не исполняет sell, несмотря на то, что я закодировал sell.
2. все еще получает отрицательную прибыль, чего, я уверен, эта стратегия не должна делать.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
когда вы запускаете Metatrader, советник должен выяснить, открыта ли сделка.
Я делаю только цикл обратного отсчета для проверки сделок, если есть сделка.
Если я устанавливаю в начале на 1 и OrdersTotal() >0, то я делаю проверку сделок if(.......> || .......> ){делаю цикл....
вы уверены, что дали мне код, который дал вам результаты, показанные выше? я тестировал его на периоде 1440 (1 день) и ни одна сделка не была выполнена. однако когда я изменил его на 1M, многие сделки были выполнены
OK вот так..... Я попытаюсь помочь здесь, если смогу.
Этот вопрос по Ma_Shift был у меня некоторое время, но я так и не смог получить на него четкого ответа.
Если вы заметите в вашем коде, что вы используете сдвиг на 8 для ваших скользящих средних.... что это значит?
Это делает разницу в 3 пункта в значении на этой свече 08:00, как показано здесь в окне данных.

Что приводит нас к вопросу: для чего нужна настройка "Shift" в конце?
Когда вы наводите курсор на график с открытым окном данных и перемещаетесь от свечи к свече.
вы увидите, как меняются цифры для 5 SMA при переходе от свечи к свече...
Именно в этом и заключается последнее значение SHIFT... помня о том, что текущая свеча, которая сейчас рисуется.
это нулевая свеча... последняя завершенная свеча - это свеча 1, так что если на вашем графике 1000 свечей, то они нумеруются в обратном порядке.
они нумеруются в обратном порядке от 999 на левом краю вашего графика до 0, где вы находитесь в данный момент.
Таким образом, если вы хотите узнать, какое значение 5 SMA было 5 завершенных свечей назад.
вы ставите 5 в этом последнем месте... конечно, с течением времени свеча 5 будет меняться на следующую свечу.
Теперь, как было сказано, если вы всегда получаете значение свечи 0... то это значение постоянно
меняется вместе с ценой. Поэтому вы можете принять сигнал, и тогда индикатор перерисует вас... но если вы
всегда запрашиваете информацию от свечи 1, то это уже сделано и не изменится.
Надеюсь, это поможет...
Я все переделал, исправил петлю, проскальзывание, исправил значения скользящей средней и RSI, убедился, что все открытые позиции закрываются перед началом новой позиции. но когда я тестирую его, ничего не происходит, ни покупка, ни продажа не выполняются... в чем проблема?
Функция init() запускается только при старте, а не на каждом тике, как функция start(). Вам нужно вернуть скользящие средние в функцию start, а не в init(), чтобы она работала и получала свежие числа...
Переработанный
Добавьте функцию, при которой советник будет проверять наличие отложенных ордеров перед тем, как принять решение об открытии новой позиции. Если есть отложенный или открытый ордер, то он не будет пытаться открыть новую позицию.at
Я вижу, что все используют цикл для проверки наличия открытых позиций перед покупкой, я не вижу в этом логики. пока OrdersTotal > 0, есть открытые ордера, и мой советник не будет пытаться открыть больше позиций.
Исправил убывающий цикл.
На этот раз он выдает ошибку OrderClose 138, которая не решается добавлением refreshrates().
и я все еще теряю деньги, чего не должно быть.
Я не могу придумать, что еще можно исправить...
Переработанный
Добавьте функцию, при которой советник будет проверять наличие отложенных ордеров, прежде чем принять решение об открытии новой позиции. Если есть отложенный или открытый ордер, то он не будет пытаться открыть новую позицию.at
Я вижу, что все используют цикл для проверки наличия открытых позиций перед покупкой, я не вижу в этом логики. пока OrdersTotal > 0, есть открытые ордера, и мой советник не будет пытаться открыть больше позиций.
Исправил убывающий цикл.
На этот раз он выдает ошибку OrderClose 138, которая не решается добавлением refreshrates().
и я все еще теряю деньги, чего не должно быть.
Я не могу придумать, что еще можно исправить...
Почему вы разместили логику для открытия покупки до того, как проверили сделки, открытые вашим советником на вашем счете ????.
Что произойдет сейчас ???? с тем программированием, которое у вас есть на данный момент?
Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.
Сколько сделок в OrdersTotal() с этой сделкой?
Ваш код.... для BUY
что он делает сейчас??? и по какой причине он это делает????
Почему вы разместили логику для открытия покупки до того, как проверили сделки, которые советник открыл на вашем счете ????.
Что произойдет сейчас ???? с тем программированием, которое у вас есть на данный момент?
Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.
Сколько сделок в OrdersTotal() с этой сделкой?
Ваш код.... для BUY
что он делает сейчас??? и по какой причине он это делает????
покупать только в том случае, если выполнены условия покупки и не открыто ни одной позиции
покупать только в том случае, если были выполнены условия покупки и если не было открыто ни одной позиции
Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.
будет ли условие истинным
не могли бы вы дать мне взглянуть на ваши коды?
Я хочу знать, почему у меня не получилось и как сделать это правильно.
.
Ваше сообщение мне Я могу дать вам полный код прямо.....
Это не будет бесплатно. Для этого вы должны использовать разделJobs и заплатить, чтобы получить его...
Вы получите его там
.
Другой способ - хорошо читать свои темы.
Мы помогаем вам здесь научиться программировать самостоятельно. Это бесплатная помощь.
Мы показываем вам ваши ошибки и помогаем вам в направлении, как решить.
Я показываю код, который у меня есть, как только вы узнаете, как его написать .....
Тогда не нужно платить, и вы можете в тот же момент сравнить его с кодом, который вы сделали здесь с помощью этого форума
....
мой последний вопрос все еще не получил ответа
Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.
будет ли условие истинным
.
. В другой темеОшибка OrderClose 138
Вам там очень хорошо помогли(RaptorUK и WHRoeder спасибо за объяснение, я думаю очень хорошо сделано)
.
У меня к вам еще один вопрос
Почему вы изменили таймфрейм при расчете скользящей средней?
Это не то же самое, что я дал,
Он не вычисляет правильное значение на другом графике Daily
.
Так что уделите время обучению и практике и внимательно читайте помощь, которую вы получаете здесь, на этом форуме.
или вы платите кому-то, чтобы программировать для вас на сайте типа Jobs.
не могли бы вы дать мне взглянуть на ваши коды?
Я хочу знать, почему у меня не получилось и как сделать это правильно.
.
Ваше сообщение мне Я могу дать вам полный код прямо.....
Это не будет бесплатно. Для этого вы должны использовать разделJobs и заплатить, чтобы получить его...
Вы получите его там
.
Другой способ - хорошо читать свои темы.
Мы помогаем вам здесь научиться программировать самостоятельно. Это бесплатная помощь.
Мы показываем вам ваши ошибки и помогаем вам в направлении, как решить.
Я показываю код, который у меня есть, как только вы узнаете, как его написать .....
Тогда не нужно платить, и вы можете в тот же момент сравнить его с кодом, который вы сделали здесь с помощью этого форума
....
мой последний вопрос все еще не получил ответа
Предположим, у вас есть счет, на котором работает ваш советник. Вы открываете вручную сделку по GBPUSD.
будет ли условие истинным
.
. В другой темеОшибка OrderClose 138
Вам там очень хорошо помогли(RaptorUK и WHRoeder спасибо за объяснения, я думаю очень хорошо сделано)
.
У меня к вам еще один вопрос
Почему вы изменили таймфрейм при расчете скользящей средней?
Это не то же самое, что я дал,
Он не вычисляет правильное значение на другом графике Daily
.
Поэтому уделите время обучению и практике и внимательно читайте помощь, которую вы получаете здесь, на этом форуме.
или вы платите кому-то, чтобы программировать для вас на сайте типа Jobs.
OrdersTotal() должна показывать общее количество отложенных ордеров и рыночных ордеров, независимо от того, были они открыты советником или вручную?
Я думал об этом следующим образом. Мой советник всегда проверяет, есть ли открытые ордера, и если есть, то он больше не будет открывать ордера, и он будет открывать новые ордера только тогда, когда нет открытых ордеров, следовательно.
Я думаю, что советник работает нормально, потому что в разделе результатов отображается последовательность ордеров 1,1,2,2,3,3,4,4, что означает, что ордер закрыт до открытия нового ордера.
переменные для скользящей средней и RSI были изменены по причинам тестирования. Я экспериментировал на разных временных рамках/периодах, но не изменил их обратно, когда разместил здесь.
И самое странное, мой код исполняет ТОЛЬКО ордер на покупку. Он никогда не исполнял даже один... ордер на продажу. Это просто странно,
В двух словах, проблемы, с которыми я все еще сталкиваюсь сейчас.
1. он исполняет только buy, но никогда не исполняет sell, несмотря на то, что я закодировал sell.
2. все еще получает отрицательную прибыль, чего, я уверен, эта стратегия не должна делать.