Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 869
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вы уж извините, стыдно обращаться по сто раз на одном и том же.
Ну уже почти месяц смотрю как баран на ворота. Ничего не пойму.
Задача высчитать скользящую среднюю меньшего порядка, имея скользящую 13,
то есть высчитать период 12, основываясь на 13
Здравствуйте! Кто-нибудь из уважаемых гуру, проверьте, плиз, начало моего первого советника. Можно ли двигаться дальше? Может что упустил? Буду очень благодарен за любую конкретику. И еще: где-то на форуме видел, как сделать, чтобы открывалась только одна позиция, но не скопировал, а теперь не могу найти. Помогите, плиз.
Спасибо!
// Пробный вариант советника
//--------------------------------------------------------------------
//------Вводные данные:-----------------------------------------------------------
input double Lots = 0.1; // Лот
input int MovingPeriod =5; // Расчетный период МА
input int MovingShift =0; // Сдвиг МА
input int InpBandsPeriod=10; // Период Bollinger Bands
input int InpBandsShift=0; // Сдвиг Bollinger Bands
input double InpBandsDeviations=2.0; // Отклонение Bollinger Bands
input int K_Period =30; // %K период Stochastic
input int D_Period =10; // %D период Stochastic
input int Slowdawn =8; // Замедление Stochastic
input color clMainStoch =Yellow; // Цвет главной линии Stochastic
input color clSignalStoch =Red; // Цвет сигнальной линии Stochastic
// -----Объявляем Глобальные переменные:------------------------------------------
double MA_0, MA_1, MA_2; // Значение МА на 0, 1 и 2 барах
double MB_0, MB_1, MB_2; // Значение средней Bollinger на 0, 1 и 2 барах
double ExtUpperBuffer[]; // Значение верхней линии Bollinger
double ExtLowerBuffer[]; // Значение нижней линии Bollinger
double Delta_0, Delta_1; // Разница межу значениями верхней и нижней ...
// ...линий Bollinger на 0 и 1 барах
double Yellow_0, Yellow_1, Yellow_2; // Значение MAIN на 0, 1 и 2 барах
double Red_0, Red_1, Red_2; // Значение SIGNAL на 0, 1 и 2 барах
//-------Поехали!----------------------------------------------------------------
int start() //Спец. функция start
{
//Обращение к функции индикатора МА
MA_0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
MA_1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1);
MA_2=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2);
//Обращение к функции Bollinger Bands
MB_0=iBands(NULL,0,InpBandsPeriod,InpBandsShift,InpBandsDeviations,PRICE_CLOSE,0);
MB_1=iBands(NULL,0,InpBandsPeriod,InpBandsShift,InpBandsDeviations,PRICE_CLOSE,1);
MB_2=iBands(NULL,0,InpBandsPeriod,InpBandsShift,InpBandsDeviations,PRICE_CLOSE,2);
Delta_0=iBands(ExtUpperBuffer[0]-ExtLowerBuffer[0]);
Delta_1=iBands(ExtUpperBuffer[1]-ExtLowerBuffer[1]);
//Обращение к функции Stochastic
Yellow_0=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,0);
Yellow_1=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,1);
Yellow_2=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,2);
Red_0=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,0);
Red_1=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,1);
Red_2=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,2);
//-------Ситуации по Стохастику:-----------------------------------------------------
//Рынок перекуплен
double MOB()=(Yellow_0>=80 && Red_0>=80); //Локальная переменная
//Рынок перепродан
double MOS()=(Yellow_0<=20 && Red_0<=20); //Локальная переменная
//Рынок в норме
double MN()=(20<Yellow_0<80 && 20<Red_0<80); //Локальная переменная
//Критическая ситуация
double MC1()=(20<Yellow_0<80 && Red_0<=20); //Локальная переменная
double MC2()=(20<Yellow_0<80 && Red_0>=80); //Локальная переменная
double MC3()=(20<Red_0<80 && Yellow_0<=20); //Локальная переменная
double MC4()=(20<Red_0<80 && Yellow_0>=80); //Локальная переменная
//-------Пример(мой) приказа на открытие позиции-----------------------------------------------------
if (Delta_0 > Delta_1 && MOB()==true) //Рынок перекуплен, но дельта расширяется
{ if (MB_2 > MB_1 && MB_1 < MB_0) //Нижний перелом Боллинджера
OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point);//открываем ордер БАЙ
Alert (GetLastError()); //Сообщение об ошибке
Alert("Открыта позиция БАЙ лотом("Lots"),цена("Ask")."); //Сообщение о покупке
В догонку: позиции БАЙ (как и СЕЛЛ) могут открываться при разных условиях, и в зависимости от того, на каких условиях открылась поз. (напр. БАЙ), будут свои условия закрытия.
Как это передать на языке МКЛ?
В догонку: позиции БАЙ (как и СЕЛЛ) могут открываться при разных условиях, и в зависимости от того, на каких условиях открылась поз. (напр. БАЙ), будут свои условия закрытия.
Как это передать на языке МКЛ?
Выбираем ордер в цикле. Если это Бай, и остальные данные (символ, магик, ещё чего-нить) соответствуют критерию того, что вот его-то и нужно закрывать при "своих условиях закрытия", то закрываем его, если "свои условия закрытия" имеют место быть.
Немного туманно для меня, но, поковырявшись,думаю пойму. Большое спасибо за то, что не отвернулись и не поучаете с вершин познания, как некоторые товаристчи из страны Советов.
Я додумался закрывать так:
//-------Пример(мой) приказа на открытие позиции с привязкой закрытия (по тикету)-----------------------------------------------------
//Локальная переменная, открывающая ордер БАЙ(вместо строки 63)
int Ticket_1() = (OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point));
//-------Тогда закрытие именно для этого приказа может быть таким:-----------------------------------------------------
if (Ticket_1()==true) //Если был открыт ордер №1, то...
{ if (Yellow_0>Red_0 && (Yellow_0-Red_0)<(Yellow_1-Red_1)) //Желтая выше красной, сужение(условие)
{ if (MA_2 < MA_1 && MA_1 > MA_0);} //Верхний перелом Средней (условие)
else (Yellow_0>Red_0 && (Yellow_0-Red_0)>(Yellow_1-Red_1)) //Желтая выше красной, расширение(альтерн.условие)
{ if (MB_2 < MB_1 && MB_1 > MB_0);} //Верхний перелом Боллинджера (условие)
bool Ans=OrderClose(Ticket,Lot,Bid,0); //...закрытие ордера (лок.переменная)
Alert("Попытка закрыть ордер БАЙ лотом("Lots"),цена("Ask"). Ожидание ответа..");
if (Ans==true) // Получилось :)
{
Alert ("Закрыт ордер БАЙ лотом("Lots"),цена закрытия("Bid");
break; // Выход из цикла закрытия позиции
}
}
Просьба дать анализ, ну и по предыдущему посту тоже. Извините за настырность, но Вы же видите - Вы единственный, кто отвечает... Спасибо!
Немного туманно для меня, но, поковырявшись,думаю пойму. Большое спасибо за то, что не отвернулись и не поучаете с вершин познания, как некоторые товаристчи из страны Советов.
Я додумался закрывать так:
...Просьба дать анализ, ну и по предыдущему посту тоже. Извините за настырность, но Вы же видите - Вы единственный, кто отвечает... Спасибо!
Ну как-то субмурно всё у вас.
1. Определяете факт наступления условия для закрытия ордера Buy
2. В цикле просматриваете все открытые позиции и, когда находите нужный ордер Buy, закрываете его.
Вот пример цикла:
Т.е., для того, чтобы закрыть ордер Buy на текущем символе (на графике, где запущен советник) и с магиком 100500 (например), нужно вызвать функцию так:
Вовсе не обязательно писать число 100500, обычно магик уже задан в советнике переменной, например int Magic = 100500; Тогда вам вместо 100500 нужно вписать Magic
В цикле там, где должно быть закрытие выбранной позиции, я не стал ничего писать, так как там должен быть вызов функции закрытия ордера по тикету. Обычно это вызов полноценной функции с обработкой кодов возврата торгового сервера. Вы, для проверки, можете вписать туда простую команду закрытия выбранного ордера OrderClose();
Так гораздо легче читать. Извините.
Есть ещё возможность править старый пост, чтобы не плодить дубли ;)
Есть ещё возможность править старый пост, чтобы не плодить дубли ;)
Ну как-то субмурно всё у вас.
1. Определяете факт наступления условия для закрытия ордера Buy
2. В цикле просматриваете все открытые позиции и, когда находите нужный ордер Buy, закрываете его.
Вот пример цикла:
Т.е., для того, чтобы закрыть ордер Buy на текущем символе (на графике, где запущен советник) и с магиком 100500 (например), нужно вызвать функцию так:
Вовсе не обязательно писать число 100500, обычно магик уже задан в советнике переменной, например int Magic = 100500; Тогда вам вместо 100500 нужно вписать Magic
В цикле там, где должно быть закрытие выбранной позиции, я не стал ничего писать, так как там должен быть вызов функции закрытия ордера по тикету. Обычно это вызов полноценной функции с обработкой кодов возврата торгового сервера. Вы, для проверки, можете вписать туда простую команду закрытия выбранного ордера OrderClose();