Возможно нужно задать вопрос по другому.
Подскажите, кто знает, как при задании условия открытия ордера обращаться не к текущему бару или несколько баров назад, а к действию, произошедшему ранее при стечении двух (или более) обстоятельств?
Может кому проще будет в самом коде пальцем ткнуть?
//+------------------------------------------------------------------+
//| GT |
//+------------------------------------------------------------------+
extern double Lots = 0.1;
extern int Expert_ID = 1;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
//H4 data
double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
//---- перебираем все открытые позиции
for ( int z = _OrdersTotal - 1; z >= 0; z -- )
{
//---- если при выборе позиции возникла ошибка, переходим к следующей
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
continue;
}
//---- если позиция открыта не по текущему инструменту, пропускаем её
if ( OrderSymbol() != Symbol() ) continue;
//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if ( OrderMagicNumber() != Expert_ID ) continue;
//---- если открыта БАЙ-позиция,
if ( OrderType() == OP_BUY )
{
//---- если условия закрытия БАЙ,
if (MAMainCurrentH4<MASignalCurrentH4 && MACDMainCurrentH4<0)
{
//---- закрываем позицию
if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderClose № ", _GetLastError );
return(-1);
}
}
//---- если сигнал не изменился, выходим - пока рано открывать новую позицию
else
{ return(0); }
}
//---- если открыта СЕЛЛ-позиция,
if ( OrderType() == OP_SELL )
{
//---- если условия закрытия СЕЛЛ,
if (MAMainCurrentH4>MASignalCurrentH4 && MACDMainCurrentH4>0)
{
//---- закрываем позицию
if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderClose № ", _GetLastError );
return(-1);
}
}
//---- если сигнал не изменился, выходим - пока рано открывать новую позицию
else return(0);
}
}
//+------------------------------------------------------------------+
//| если выполнение дошло до этого места, значит открытой позиции нет
//| проверяем, есть ли возможность открыть позицию
//+------------------------------------------------------------------+
//---- если условия для покупки,
if (MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0
&& MAMainCurrentH4>MASignalCurrentH4 && MACDMainCurrentH4>0)
{
//---- открываем БАЙ позицию
if ( OrderSend( Symbol(), OP_BUY, Lots, Ask, 0, 0, 0, "MACD_test",
Expert_ID, 0, Blue ) < 0 )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderSend № ", _GetLastError );
return(-1);
}
return(0);
}
//---- если условия для продажи,
if (MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0
&& MAMainCurrentH4<MASignalCurrentH4 && MACDMainCurrentH4<0)
{
//---- открываем СЕЛЛ позицию
if ( OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "MACD_test",
Expert_ID, 0, Green) < 0 )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderSend № ", _GetLastError );
return(-1);
}
return(0);
}
return(0);
}
//the end
т.е. поставьте в том месте где вам нужно такой комментарий: ЗДЕСЬ должно быт тот и то то, + вопрос - как это реализовать.
День добрый.
Наверное Korey прав и нужно спросить КАК это сделать с самого начала, без своих умозаключений.
Изначальная идея из учебника ТА - ищем тренд на старшем таймфрейме, а затем точки входа на младшем. Для поиска тренда используем пересечения основной и сигнальной МА Weekly и MACD Weekly с нулевой линией. Получаем программу:
//+------------------------------------------------------------------+
//| GT |
//+------------------------------------------------------------------+
extern double Lots = 0.1;
extern int Expert_ID = 1;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
//H4 data
double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
//---- перебираем все открытые позиции
for ( int z = _OrdersTotal - 1; z >= 0; z -- )
{
//---- если при выборе позиции возникла ошибка, переходим к следующей
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
continue;
}
//---- если позиция открыта не по текущему инструменту, пропускаем её
if ( OrderSymbol() != Symbol() ) continue;
//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if ( OrderMagicNumber() != Expert_ID ) continue;
//---- если открыта БАЙ-позиция,
if ( OrderType() == OP_BUY )
{
//---- если условия закрытия БАЙ,
if (MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0)
{
//---- закрываем позицию
if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderClose № ", _GetLastError );
return(-1);
}
}
//---- если сигнал не изменился, выходим - пока рано открывать новую позицию
else
{ return(0); }
}
//---- если открыта СЕЛЛ-позиция,
if ( OrderType() == OP_SELL )
{
//---- если условия закрытия СЕЛЛ,
if (MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0)
{
//---- закрываем позицию
if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderClose № ", _GetLastError );
return(-1);
}
}
//---- если сигнал не изменился, выходим - пока рано открывать новую позицию
else return(0);
}
}
//+------------------------------------------------------------------+
//| если выполнение дошло до этого места, значит открытой позиции нет
//| проверяем, есть ли возможность открыть позицию
//+------------------------------------------------------------------+
//---- если условия для покупки,
if (MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0)
{
//---- открываем БАЙ позицию
if ( OrderSend( Symbol(), OP_BUY, Lots, Ask, 0, 0, 0, "MACD_test",
Expert_ID, 0, Blue ) < 0 )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderSend № ", _GetLastError );
return(-1);
}
return(0);
}
//---- если условия для продажи,
if (MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0)
{
//---- открываем СЕЛЛ позицию
if ( OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "MACD_test",
Expert_ID, 0, Green) < 0 )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderSend № ", _GetLastError );
return(-1);
}
return(0);
}
return(0);
}
//the end
и её результат - опа "нашли " тренд:
Вопрос: как должен выглядеть код открытия позиций в период "тренда" weekly, от А до В, и условием открытия - основная МА Н4 пересекает сигнальную МА Н4 и MACD Н4 пересекает нулевую линию. Проблема с которой я столкнулся, что позиции не открываются в период С и D.
extern double Lots = 0.1; extern int Expert_ID = 1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { //Weekly data double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0); double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0); double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0); double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); //H4 data double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0); double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0); double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0); double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); bool ISBUY = MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0; bool ISSELL = MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0; bool isWbuy = MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0;// недельный бай bool isWsell = MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0;//sell of Week int _GetLastError = 0, _OrdersTotal = OrdersTotal(); //---- перебираем все открытые позиции for ( int z = _OrdersTotal-1 ; z >=0; z -- ) { //---- если при выборе позиции возникла ошибка, переходим к следующей if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError ); continue; } //---- если позиция открыта не по текущему инструменту, пропускаем её if ( OrderSymbol() != Symbol() ) continue; //ОШИБКА //---- если MagicNumber не равен Expert_ID, пропускаем эту позицию if ( OrderMagicNumber() != Expert_ID ) continue; //ОШИБКА //---- если открыта БАЙ-позиция, if ( OrderType() == OP_BUY ) { //---- если условия закрытия БАЙ, if (ISBUY) { //---- закрываем позицию if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderClose № ", _GetLastError ); return(-1); } } //---- если сигнал не изменился, выходим - пока рано открывать новую позицию else { return(0); } } //---- если открыта СЕЛЛ-позиция, if ( OrderType() == OP_SELL ) { //---- если условия закрытия СЕЛЛ, if (ISSELL) { //---- закрываем позицию if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderClose № ", _GetLastError ); return(-1); } } //---- если сигнал не изменился, выходим - пока рано открывать новую позицию else return(0); } } //+------------------------------------------------------------------+ //| если выполнение дошло до этого места, значит открытой позиции нет //| проверяем, есть ли возможность открыть позицию //+------------------------------------------------------------------+ //---- если условия для покупки, if (isWbuy) { //---- открываем БАЙ позицию if ( OrderSend( Symbol(), OP_BUY, Lots, Ask, 0, 0, 0, "MACD_test", Expert_ID, 0, Blue ) < 0 ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderSend № ", _GetLastError ); return(-1); } return(0); } //---- если условия для продажи, if (isWsell) { //---- открываем СЕЛЛ позицию if ( OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "MACD_test", Expert_ID, 0, Green) < 0 ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderSend № ", _GetLastError ); return(-1); } return(0); } return(0); } //the end
Тогда это вопрос относится к стилю программирования.
Большинство выложенных советников написаны безструктурно. Это как бы дань прошлому когда встроенные языки не были полными комиляторами.
т.е. код выписан последовательно без разбиения на функции,
и главное не используются логические переменные, условия проверяются по месту в виде громоздикх "формул".
такой стиль применялся еще в "древнем Риме".
и это же мешает реализовывать новые идеи, т.к. путает мышление - все в одну кучу.
Для перехода к структурному программировнаию
Первое что надо сделать - ввсе логические проверки цены оформить в виде булевских переменных.
голова прояснится и будет понятно куда и как вставлять условие от W1.
(замечание - логику проверки ордеров не трогаем)
=====после сбора логики в булевские перменные текст советника .
Видим:
1. авторская идея не реализована, т.к. недельные сигналы на открытие ордеров не влияют.
должно быть isWbuy&&ISBUY
2. имеются синтаксические ошибки: оператор continue пропускает все операторы до конца цикла. Это ошибка, здесь нужны скобки блока.
Во как! Особенно порадовало про "...стиль в "Древнем Риме". А в целом замечания приняты и на ус намотаны. Теперь, что мы имеем. У нас есть "тренд":
И хотим мы открыть позицию в направлении тренда 2002.09.29 (показано стрелочкой). Однако в этот день позиция, конечно, не откроется, а откроется она только 2002.11.10 по условиям кода:
Как так? Ведь на 2002.09.29 тренд вверх имеется! Условие открытия неправильное.
А должно быть по типу:
- запрос на 2002.09.29 - ответ тренда нет (не совпадают первое и второе условия (МА и MACD) для выявления тренда)
- смотрим бар перед этим - тоже нет
- бар перед этим - тоже нет
..........................................
- бар перед этим - опа условия обоих сигналов для тренда вверх - значит на 2002.09.29 у нас тренд вверх, значит можно открыть бай позицию.
Ха! Древнеримовский метод:
Прописать в начале double-ом штук надцать условий с разными сдвигами 0,1,2,3...относительно 1-го бара, а потом их все перебирать.
Посовременней мысль если не трудно.....плиз.
PS: Читал "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота" - там примерно то, что в конечном итоге мне и нужно. А вот само определение тренда не одним, а двумя (тремя и более) индикаторами может быть рациональна?
Продолжаем:
- исправляем ошибки кода.
- собираем oкончательно все условия в одном месте.
- вставляем счетчик открытых ордеров.
получаем - как бы нижнюю часть советника в которую нет необходимости заглядывать (если отлажена)
- и далее работаем только с верзхней частью где условия.
замечание: условия я не проверял, а это как бы болванка.
extern double Lots = 0.1; extern int Expert_ID = 1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int CountOpenBuy,CountOpenSell; //Weekly data double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0); double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0); double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0); double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); //H4 data double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0); double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0); double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0); double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); bool ISBUY = MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0; bool ISSELL = MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0; bool isWbuy = MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0;// недельный бай bool isWsell = MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0;//sell of Week bool openBuy=ISBUY; //здесь долно быть полное условие открытия && не закрытие bool openSell=ISSELL; bool closeBuy=ISSELL;//здесь должно быть полное условие закрытия bool closeSell=ISBUY; int _GetLastError = 0, _OrdersTotal = OrdersTotal(); //---- перебираем все открытые позиции for ( int z = _OrdersTotal ; z >0; z -- )//исправление: границы цикла { //---- если при выборе позиции возникла ошибка, переходим к следующей if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError ); continue; } //---- если позиция открыта не по текущему инструменту, пропускаем её if ( OrderSymbol() != Symbol() ) { if ( OrderMagicNumber() != Expert_ID ) { if ( OrderType() == OP_BUY ) { CountOpenBuy+=1; // подсчитываем наши ордера бай if (closeBuy) //---- закрываем позицию { if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderClose № ", _GetLastError ); } } } //---- если открыта СЕЛЛ-позиция, if ( OrderType() == OP_SELL ) {CountOpenSell+=1; //колво ордеров селл if (closeSell)//---- если условия закрытия СЕЛЛ, { //---- закрываем позицию if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderClose № ", _GetLastError ); return(-1); } } } }//magic }//symbol }//z //секция открытия ордеров if(CountOpenBuy==0) { if(openBuy) {} } if(CountOpenSell==0) { if(openSell) {} } return(0); }
Ликбез продолжается. Однако не приблизились к ответам на вопросы прошлого поста:
1.
"А должно быть по типу:
- запрос на 2002.09.29 - ответ тренда нет (не совпадают первое и второе условия (МА и MACD) для выявления тренда)
- смотрим бар перед этим - тоже нет
- бар перед этим - тоже нет
..........................................
- бар перед этим - опа условия обоих сигналов для тренда вверх - значит на 2002.09.29 у нас тренд вверх, значит можно открыть бай позицию.
Ха! Древнеримовский метод:
Прописать в начале double-ом штук надцать условий с разными сдвигами 0,1,2,3...относительно 1-го бара, а потом их все перебирать.
Посовременней мысль если не трудно.....плиз.
PS: Читал "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота" - там примерно то, что в конечном итоге мне и нужно. А вот само определение тренда не одним, а двумя (тремя и более) индикаторами может быть рациональна?"
2.
Функции
//---- если позиция открыта не по текущему инструменту, пропускаем её
if ( OrderSymbol() != Symbol() ) continue; //ОШИБКА
//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if ( OrderMagicNumber() != Expert_ID ) continue; //ОШИБКА
и до исправления работали стабильно позволяя разным советникам одновременно открывать лоты на разных валютных парах:
Ну да ладно - сказано люмний, значит люминий - пусть будут без continue и с фигурными скобками.
3.
И даже шаг назад. Код:
extern double Lots = 0.1; extern int Expert_ID = 1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int CountOpenBuy,CountOpenSell; //Weekly data double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0); double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0); double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0); double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); //H4 data double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0); double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0); double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0); double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); bool ISBUY = MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0; bool ISSELL = MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0; bool isWbuy = MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0;// недельный бай bool isWsell = MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0;//sell of Week bool openBuy=isWbuy; //здесь долно быть полное условие открытия && не закрытие bool openSell=isWsell; bool closeBuy=ISBUY;//здесь должно быть полное условие закрытия bool closeSell=ISSELL; int _GetLastError = 0, _OrdersTotal = OrdersTotal(); //---- перебираем все открытые позиции for ( int z = _OrdersTotal ; z >0; z -- )//исправление: границы цикла { //---- если при выборе позиции возникла ошибка, переходим к следующей if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError ); continue; } //---- если позиция открыта не по текущему инструменту, пропускаем её if ( OrderSymbol() != Symbol() ) { if ( OrderMagicNumber() != Expert_ID ) { if ( OrderType() == OP_BUY ) { CountOpenBuy+=1; // подсчитываем наши ордера бай if (closeBuy) //---- закрываем позицию { if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderClose № ", _GetLastError ); } } } //---- если открыта СЕЛЛ-позиция, if ( OrderType() == OP_SELL ) {CountOpenSell+=1; //колво ордеров селл if (closeSell)//---- если условия закрытия СЕЛЛ, { //---- закрываем позицию if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderClose № ", _GetLastError ); return(-1); } } } }//magic }//symbol }//z //секция открытия ордеров if(CountOpenBuy==0) { if(openBuy) { //---- открываем БАЙ позицию if ( OrderSend( Symbol(), OP_BUY, Lots, Ask, 0, 0, 0, "test", Expert_ID, 0, Blue ) < 0 ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderSend № ", _GetLastError ); return(-1); } return(0); } } if(CountOpenSell==0) { if(openSell) { //---- открываем СЕЛЛ позицию if ( OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "test", Expert_ID, 0, Green) < 0 ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderSend № ", _GetLastError ); return(-1); } return(0); } } return(0); }
выдаёт открытие позиций подряд на величину баланса и не закрытие их вообще.
чтобы решить главный вопрос нужно чтобы "ракета со старта ушла"
т.е. нужно чтобы советник правильно открывал и закрывал ордера, например по МА.
И только когда эта часть уверенно торгует и открывает не более одного ордера
двигаемся дальше - усложняем условия.
Иначе будет непонятно где исправлять))))
----
Итак, допустим советник работает по персечению МА - это тест.
- > Добавляем тренд со старшего тф
варианты
1. условие "в лоб" младший тф&& перeсечение старшего тф
здесь мы должны запоминать условие "пересечение старшего тф" в статической переменной или в глобальных и хранить его до следущего изменения.
2. условие по наклону = определяем наклон МА страшего тф.
3. условие по раскрытию - определяем угол между быстрой и медленной МА старшего тф.
4. взвешенное условие - в целеой функции суммируем с весами условия 2 и 3 + другие условия.
Что-то не моделируется ракета. Как раз после исправления
//---- если позиция открыта не по текущему инструменту, пропускаем её
if ( OrderSymbol() != Symbol() ) continue; //ОШИБКА
//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if ( OrderMagicNumber() != Expert_ID ) continue; //ОШИБКА
на
//---- если позиция открыта не по текущему инструменту, пропускаем её
{if ( OrderSymbol() != Symbol() )
//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
{if ( OrderMagicNumber() != Expert_ID )
,,,,,,,,,,,,,,,,,,,,,,
}
}
и начинаются глюки с бесконтрольным открытием позиций.
extern double Lots = 0.1; extern int Expert_ID = 1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { //Weekly data double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0); double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0); double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0); double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); //H4 data double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0); double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0); double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0); double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); bool ISBUY = MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0; bool ISSELL = MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0; bool isWbuy = MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0;// недельный бай bool isWsell = MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0;//sell of Week int _GetLastError = 0, _OrdersTotal = OrdersTotal(); //---- перебираем все открытые позиции for ( int z = _OrdersTotal-1 ; z >=0; z -- ) { //---- если при выборе позиции возникла ошибка, переходим к следующей if ( !OrderSelect( z, SELECT_BY_POS ) ) { _GetLastError = GetLastError(); Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError ); continue; } //---- если позиция открыта не по текущему инструменту, пропускаем её {if ( OrderSymbol() != Symbol() ) //---- если MagicNumber не равен Expert_ID, пропускаем эту позицию {if ( OrderMagicNumber() != Expert_ID ) //---- если открыта БАЙ-позиция, if ( OrderType() == OP_BUY ) { //---- если условия закрытия БАЙ, if (ISBUY) { //---- закрываем позицию if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderClose № ", _GetLastError ); return(-1); } } //---- если сигнал не изменился, выходим - пока рано открывать новую позицию else { return(0); } } //---- если открыта СЕЛЛ-позиция, if ( OrderType() == OP_SELL ) { //---- если условия закрытия СЕЛЛ, if (ISSELL) { //---- закрываем позицию if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderClose № ", _GetLastError ); return(-1); } } //---- если сигнал не изменился, выходим - пока рано открывать новую позицию else return(0); } } } } //+------------------------------------------------------------------+ //| если выполнение дошло до этого места, значит открытой позиции нет //| проверяем, есть ли возможность открыть позицию //+------------------------------------------------------------------+ //---- если условия для покупки, if (isWbuy) { //---- открываем БАЙ позицию if ( OrderSend( Symbol(), OP_BUY, Lots, Ask, 0, 0, 0, "MACD_test", Expert_ID, 0, Blue ) < 0 ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderSend № ", _GetLastError ); return(-1); } return(0); } //---- если условия для продажи, if (isWsell) { //---- открываем СЕЛЛ позицию if ( OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "MACD_test", Expert_ID, 0, Green) < 0 ) { _GetLastError = GetLastError(); Alert( "Ошибка OrderSend № ", _GetLastError ); return(-1); } return(0); } return(0); } //the end
извини слишком тоталитарно отнесся к коду.
Там же ! стояло то есть отрицание, значит правильно было.
Нужно было сопротивляться, отстаивать свой код))
а теперь с фигурными скобками, будет правильно если отрицание убрать,
{if ( OrderSymbol() != Symbol() ) //---- если MagicNumber не равен Expert_ID, пропускаем эту позицию {if ( OrderMagicNumber() != Expert_ID )
убрать отрицание
P.S. С фигурными скобками лучше, т.к. по continue пропусчкалась проверка ордеров sell
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброго времени суток.
Суть такова, что тренд определяется со старшего таймфрейма. Для определения тренда используются два сигнала: 1. Пересечение быстрой и медленной MA и 2. Пересечение MACD нулевой отметки. Смысл - в отсеивании ложных пересечений.
if (MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0)
{
//---- открываем СЕЛЛ позицию
if ( OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "MACD_test",
Expert_ID, 0, Green) < 0 )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderSend № ", _GetLastError );
return(-1);
}
return(0);
}
Итак мы имеем тренд вниз на Weekly:
Далее ищем точки входа, допустим по Н4, по тем же услоиям т.е.: 1. Пересечение быстрой и медленной MA и 2. Пересечение MACD нулевой отметки, но только в направлении тренда Weekly. И вот какую бяку получаем:
На участке отмеченном стрелками не было продаж по условиям кода:
//---- если условия для продажи,
if (MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0
&& MAMainCurrentH4<MASignalCurrentH4 && MACDMainCurrentH4<0)
{
//---- открываем СЕЛЛ позицию
if ( OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "MACD_test",
Expert_ID, 0, Green) < 0 )
{
_GetLastError = GetLastError();
Alert( "Ошибка OrderSend № ", _GetLastError );
return(-1);
}
return(0);
}
т.е. быстрая МА Weekly в тот период была выше медленой МА Weekly, что запрещало продажу по Н4 и согласно кода всё правильно, НО .
Теперь попробую сформулировать вопрос: КАК ДОЛЖЕН ВЫГЛЯДЕТЬ КОД ТРЕНДА weekly В УСЛОВИИ ПРОДАЖИ, ЧТОБЫ ВХОД ПО Н4 ОСУЩЕСТВЛЯЛСЯ НА ВСЁМ ПРОТЯЖЕНИИ ТРЕНДА?
т.е. можно ли закодировать тренд weekly, что ВОТ - ОН ЕСТЬ и на всём его протяжении Н4 должно продаваться?