![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
leonid553 |
![]()
Сообщение
#221
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Вот код самой-самой первой - простейшей версии советника ST+ENV :
Код //+------------------------------------------------------------------+ //|Stochastic_Env.mq4.mq4 //| leonid553 & co //| http://www.tradersforum.net.ru/ //+------------------------------------------------------------------+ #property copyright "leonid553 & co" #property link "http://www.tradersforum.net.ru/" //---- input parameters--------- extern int Stochastic_period=14; extern int Env_period=25; extern int Env_shift=1; extern double Env_deviation=20; //------------------------------ extern int TP=30; extern int SL=30; extern double Lot=0.1; extern int Slippage=3; //------------------- int ticket; //********************************************************************* //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- if (Env_deviation==0) Env_deviation=0.1; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double Stochastic_array[49]; //заполняем массив значениями Stochastic-----------------] int i=0; while (i<50) { Stochastic_array[i]= iStochastic(NULL, 0, Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, i); i++; } //------------------------------------------------------ ArraySetAsSeries(Stochastic_array,true); // []Цепляем на стохастик конверт - Envelope : double En0_low=iEnvelopesOnArray(Stochastic_array,0,Env_period,0,Env_shift,Env_deviation,MODE_LOWER,0); double En0_up=iEnvelopesOnArray(Stochastic_array,0,Env_period,0,Env_shift,Env_deviation,MODE_UPPER,0); double Stochastic_0=iStochastic(NULL, 0, Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 0); double Stochastic_1=iStochastic(NULL, 0, Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 1); //]===== Ищем возможность войти в рынок ]========================================================= int Orders=OrdersTotal (); //[color=#3333FF]получаем кол-во открытых ордеров[/color] if (Orders==0) //[color=#3333FF]если нет открытых ордеров[/color] { //проверяем условие на покупку-------------[/ if ( /*(Stochastic_1<low_lim) && (Stochastic_0>low_lim) &&*/ (Stochastic_1<En0_low) && (Stochastic_0>En0_low) ) { ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,NULL,0,0,CLR_NONE); if (ticket<0) { Print("Ошибка открытия ордера BUY #", GetLastError()); return (0); } } //[]--------проверяем условие на продажу if ( /*(Stochastic_1>up_lim) && (Stochastic_0<up_lim) && */ (Stochastic_1>En0_up) && (Stochastic_0<En0_up)) { ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage,Bid+SL*Point,Bid-TP*Point,NULL,0,0,CLR_NONE); if (ticket<0) { Print("Ошибка открытия ордера SELL #", GetLastError()); return (0); } } //------------------------------------------------------------------ } //************************************************************************ //---- return(0); } Попробуем вставить сюда открытие второго - локирующего ордера. |
leonid553 |
![]()
Сообщение
#222
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Прошу тех, кому интересно, и кто хоть чуть разбирается в программировании, - подсказывать по ходу дела ...
Сначала, видимо, нужно задать Магик уже имеющегося ордера, - заложеннного в советнике. ВВодим во внешние параметры extern int MagicNumber = 294; Затем нужно ввести этот номер в тикет Код //---------проверяем условие на покупку---------------------------- if ( (Stochastic_1<En0_low) && (Stochastic_0>En0_low) ) { //----- ПОКУПАЕМ------ ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,NULL,MagicNum,0,Green); if (ticket<0) { Print("Ошибка открытия ордера BUY #", GetLastError()); return (0); } } //--------проверяем условие на продажу------------------------------ if ( (Stochastic_1>En0_up) && (Stochastic_0<En0_up)) { //-----ПРОДАЕМ -------- ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage,Bid+SL*Point,Bid-TP*Point,NULL,MagicNum,0,Red); if (ticket<0) { Print("Ошибка открытия ордера SELL #", GetLastError()); return (0); } } |
NoName |
![]()
Сообщение
#223
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
Вставлю свои две копейки
![]() Этот советник расчитан для тестера. В крайнем случае для демо, но ТОЛЬКО ДЛЯ ОДНОГО ГРАФИКА. Это потому что изначально не был предусмотрен Magic, и потому что учёт ордеров происходит очень простым способом: Код int Orders=OrdersTotal (); //получаем кол-во открытых ордеров if (Orders==0) //если нет открытых ордеров Если у нас будет отрыт ордер на другом графике - то на нашем OrdersTotal () вернёт значение отличное от нуля, и советник не сработатет. Так же, изначально, стратегия предусматривала наличие только одного открытого ордера. В случае с двумя ордерами, целесообразно ввести два Magic-а, для основного ордера и для локирующего. например: Код int Magic =111; int MagicLock =222; А в дальнейшем по коду контролировать их конструкцией типа: Код for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol()) { if (OrderMagicNumber() == Magic) { // сейчас обычный ордер. // что-то с ним делаем ... } if (OrderMagicNumber() == MagicLock) { // сейчас выбран локирующий ордер. // что-то с ним делаем ... } } } } Но это в общих чертах. Для начала ноплохо было бы уточнить при каких условиях нужно открывать локирующую позицию, и при каких условиях её закрывать. |
leonid553 |
![]()
Сообщение
#224
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Благодарю Андрей !
След. вводим во внешние параметры extern int MagicNum = 294; extern int MagicLock = 295; |
leonid553 |
![]()
Сообщение
#225
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
идем дальше...
Предположим у нас уже открылась длинная позиция. Тогда - Код for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol()) && (OrderMagicNumber() == MagicNum) { if (OrderType() == OP_BUY) { if(Bid >/.... условие для лока { // сейчас обычный ордер. // что-то с ним делаем ... } if (OrderMagicNumber() == MagicLock) |
leonid553 |
![]()
Сообщение
#226
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
C первой позицией пока ничего не предполагается делать.
Условия же для открытия лока будут такие : Если цена пошла против первой позиции в убыток более, чем на "m" пунктов, - открываем локирующую. И введем для этого во внешние параметры extern int m=20; extern int TP_lock=30; extern int SL_lock=30; ---------------------------------------------------- Никак не соображу, как написать условие для открытия локирующей позиции. От чего оттолкнуться.... От величины тейкпрофита? ------------------------------------------------------------------------------------ if (OrderType() == OP_BUY) // ---длинная позиция открылась---------- { if(Bid < (OrderTakeProfit() + (m+ spread)* Point)) // - если убыток позиции превышает "m", то открываем лок SELL { ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage, Bid+SL_lock*Point, Bid-TP_lock*Point, NULL, MagicLock, 0, Aqua); } ----------------------------------------------------------------------------- Вроде так .... |
NoName |
![]()
Сообщение
#227
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
Думаю, лучше будет привязаться либо к цене открытия ордера, либо к текущему профиту.
Из справки: double OrderOpenPrice( ) Возвращает цену открытия для выбранного ордера. Ордер должен быть предварительно выбран с помощью функции OrderSelect(). double OrderProfit( ) Возвращает значение чистой прибыли (без учёта свопов и комиссий) для выбранного ордера. Для открытых позиций это - текущая нереализованная прибыль. Для закрытых ордеров - зафиксированная прибыль. Ордер должен быть предварительно выбран с помощью функции OrderSelect(). Мне кажется, предпочтительнее и проще использовать последний вариант. |
leonid553 |
![]()
Сообщение
#228
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Мы уже вроде выбрали ордер с пом. OrderSelect().
Т. е. нам теперь нужно иначе написать строку if(Bid < (OrderTakeProfit() + (m+ spread)* Point)) // - если убыток позиции превышает "m", то открываем лок SELL Теперь здесь нужно задействовать OrderProfit( ) ? |
NoName |
![]()
Сообщение
#229
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
нет!
OrderTakeProfit() - нам не нужен. Он возвращает нам цену на которую выставлен тейк. OrderProfit() вернёт текущий профит ордера. Его нужно сравнивать с величиной m и принимать решение. Код if (OrderProfit() < -m) { //... действия... } Примерно так. P.S. Прошу прощения, не внимательно прочёл предыдущий пост. Совершенно верно, указанную строку нужно заменить подобно той что привёл выше. Сообщение отредактировал NoName - 6.5.2007, 18:28 |
leonid553 |
![]()
Сообщение
#230
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) ![]() |
Продолжаем.
Открываем локирующую позицию. Код ------------------------------------------------------------------------------------ { if (OrderType() == OP_BUY) // ---длинная позиция открылась---------- { if OrderProfit() < ((-1)*m) // - если убыток позиции превышает "m", то открываем лок SELL { ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage, Bid+SL_lock*Point, Bid-TP_lock*Point, NULL, MagicLock, 0, Aqua); } } } else //иначе - если открыта короткая позиция и убыток ....... { Вот теперь уже видно - проясняется ситуация..... |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 24.4.2025, 4:38 |