İlk deney olarak, aşağıdaki algoritmayı uygulamaya karar verdim: Bollinger bantları dar bir koridorda birleştikten sonra, bir süre sonra piyasada yukarı veya aşağı keskin bir hareket olacağını bekleyebiliriz. Expert Advisor'da Bollinger Bantlarının durumunu analiz ediyorum ve yakın olduklarında ( Delta puanları ), piyasanın iyileşeceğini umarak aşağı yönde (alt satırın altındaki StepOpen noktalarında) bekleyen bir satış emri veriyorum . bu yönde keskin bir şekilde hareket edecektir. Piyasa diğer yöne gittiyse, bu emri silmeniz yeterlidir.
externdouble Delta= 800.0 ; // Ширина канала, которую мы считаем достаточно узкой чтобы ожидать скоро серьезного движения в одну из сторонexterndouble StepOpen= 150.0 ; // Отступ от линии Боллинджера для открытия отложенного ордераexterndouble TP= 350.0 ; // Take Profitexterndouble SL= 400.0 ; // Stop Lossint start()
{
double T1= iBands ( NULL , 0 , 20 , 2 , 0 , PRICE_CLOSE ,MODE_UPPER, 0 ); // верхняя линия Боллинджераdouble T2= iBands ( NULL , 0 , 20 , 2 , 0 , PRICE_CLOSE ,MODE_LOWER, 0 ); // нижняя линия Боллинджераif ((Ask>T1+StepOpen* Point )&& OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES)==true) OrderDelete ( 0 ); // если рынок пошел вверх – то удаляем отложенный ордерif ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES)==true) return ( 0 ); // если есть ранее открытый ордер – прекращаем выполнение текущей итерации советникаif (T1-T2<Delta* Point ) { // если линии Боллинджера сблизились ближе чем на Delta пунктов начинаем операцию открытия ордераdouble PriceOpen= NormalizeDouble (T2-StepOpen* Point , 5 ); // вычисляем цену открытияdouble StopLoss= NormalizeDouble (T2-StepOpen* Point +SL* Point , 5 ); // вычисляем StopLossdouble TakeProfit= NormalizeDouble (T2-StepOpen* Point -TP* Point , 5 ); // вычисляем TakeProfitOrderSend ( Symbol (),OP_SELL, 0.1 ,PriceOpen, 5 ,StopLoss,TakeProfit, 0 , 0 , 0 , Green ); // открываем ордер на продажу
}
return ( 0 );
}
Algoritma kararsız, bazen kısa sürede iki emir açıyor, sürekli OrderSend Error 130 ve OrderSend Error 138 hataları üretiyor ve piyasa ters yönde hareket ederse açık emirleri silmek hiç çalışmıyor.
Tavsiye konusunda yardım için büyük bir istek! Teşekkür ederim!
Bir bar açma kurulumunuz varsa, işte bir şablon, işe yarıyor.
Büyük bir rica Bu işlevi danışmana kendiniz girebilir misiniz? Resim, bir çubukta açılan 3 siparişi göstermektedir. Ve sadece bir taneye ihtiyacın var. Kodu düzeltemiyorum. TEŞEKKÜRLER.
//+------------------------------------------------------------------+int start()
//+------------------------------------------------------------------+
{
//--- Разрешение на открытие позиций - каждую свечуif (candle_time != Time[ 0 ])
{
candle_time = Time[ 0 ];
new_bar_buy = true;
new_bar_sell = true;
}
if ( Bars < bars_count){ Print ( "Мало данных для работы" ); return ( 0 );}
//--- Получение значений индикатора iMA
ma10 = iMA ( Symbol (), Period (), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift);
ma20 = iMA ( Symbol (), Period (), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift);
ma11 = iMA ( Symbol (), Period (), MA1_period, MA1_shift, MA1_method, MA1_price, bars_shift+ 1 );
ma21 = iMA ( Symbol (), Period (), MA2_period, MA2_shift, MA2_method, MA2_price, bars_shift+ 1 );
if (Revers)
{
if (rsi> 50 && rsi< 70 ) //--- включена инверсия
{
//--- Условие для продажиif (ma11 < ma21 && ma10 > ma20 && ma30 > ma10 && new_bar_sell)
{
sell_open=true;
new_bar_sell = false;
}
}
if (rsi> 30 && rsi< 50 ) //--- включена инверсия
{
//--- Условие для продажиif (ma11 > ma21 && ma10 < ma20 && ma30 < ma10 && new_bar_buy)
{
buy_open=true;
new_bar_buy = false;
}
}
}
//--- выставление рыночных ордеровif ( IsTradeAllowed ())
{
Trade_BUY();
Trade_SELL();
}
return ( 0 );
//+------------------------------------------------------------------+void Trade_BUY()
//+------------------------------------------------------------------+
{
for ( int i = 0 ; i < OrdersTotal (); i++ )
{
if ( OrderSelect ( i, SELECT_BY_POS, MODE_TRADES ) )
{
if (( OrderSymbol () != Symbol ()) || ( OrderMagicNumber () != Magic)) continue ; //не наш ордерif ( OrderType () == OP_BUY) // если ордер OP_BUY
{
min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
//--- проверка на работу трейлинг стопаif (trailing_stop != 0.0 && Ask > NormalizeDouble ( OrderStopLoss () + (stop_loss_buy + MathMax (min_level, trailing_stop)) * Point , Digits ) && OrderProfit () > 0 )
{
if ( OrderModify ( OrderTicket (), OrderOpenPrice (),
NormalizeDouble ( OrderStopLoss () + MathMax (min_level, trailing_stop) * Point , Digits ),
OrderTakeProfit (), 0 , CLR_NONE ))
{
Print ( "Сработал трейлинг стоп для Buy" );
}
else
{
Print ( "Ошибка модификации ордера #" , GetLastError ());
}
RefreshRates ();
Sleep ( 3000 );
} //end modify
} // end BUY
} //end OrderSelectelse
{
Print ( "OrderSelect ошибка #" , GetLastError () );
Sleep ( 3000 );
RefreshRates ();
return ;
}
} // end for//--- Открываем ордер если есть сигналwhile (buy_open)
{
//--- нормализация лота
lot = Normalize_Lot(Lots);
//--- проверка на наличие свободной маржиif ( AccountFreeMarginCheck ( Symbol (),OP_BUY, lot) <= 0 || GetLastError () == 134 )
{
Print ( "Недостаточно свободной маржи для открытия ордера" );
buy_open = false;
break ;
}
min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
if ( OrderSend ( Symbol (), OP_BUY, lot, NormalizeDouble (Ask, Digits ), slippage,
NormalizeDouble (Bid - MathMax (stop_loss_buy, min_level) * Point , Digits ),
NormalizeDouble (Bid + MathMax (take_profit_buy,min_level) * Point , Digits ),
DoubleToStr (Magic, 0 ), Magic, 0 , Blue ) > 0 )
{
PlaySound ( "Wait.wav" );
buy_open = false; // ордер открытbreak ;
}
else
{
int Error = GetLastError (); // Не получилось :(switch (Error) // Преодолимые ошибки
{
case138 : Alert ( "Ошибка: " ,Error, " Новые цены." );
RefreshRates ();
continue ;
case135 : Alert ( "Ошибка: " ,Error, " Цена изменилась." );
RefreshRates ();
continue ;
case136 : Alert ( "Нет цен." );
while ( RefreshRates () == false)
Sleep ( 500 );
continue ;
case146 : Alert ( "Подсистема торговли занята." );
Sleep ( 500 );
RefreshRates ();
continue ;
default : Alert ( "Возникла ошибка " , Error, " Выход из подпрограммы." ); // Другие варианты ошибок
} // end switch
} // end elsebreak ;
} // end while
} // end Trade_BUY//+------------------------------------------------------------------+void Trade_SELL()
//+------------------------------------------------------------------+
{
for ( int i = 0 ; i < OrdersTotal (); i++ )
{
if ( OrderSelect ( i, SELECT_BY_POS, MODE_TRADES ) )
{
if (( OrderSymbol () != Symbol ()) || ( OrderMagicNumber () != Magic)) continue ; //не наш ордерif ( OrderType () == OP_SELL) //если ордер OP_SELL
{
min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
//--- проверка на работу трейлинг стопаif (trailing_stop != 0.0 && Bid < NormalizeDouble ( OrderStopLoss () - (stop_loss_sell + MathMax (min_level, trailing_stop)) * Point , Digits )&& OrderProfit () > 0 )
{
if ( OrderModify ( OrderTicket (), OrderOpenPrice (),
NormalizeDouble ( OrderStopLoss () - MathMax (min_level, trailing_stop) * Point , Digits ),
OrderTakeProfit (), 0 , CLR_NONE ))
{
Print ( "Сработал трейлинг стоп для Sell" );
}
else
{
Print ( "Ошибка модификации ордера #" , GetLastError ());
}
RefreshRates ();
Sleep ( 3000 );
}
} // end BUY
} //end OrderSelectelse
{
Print ( "OrderSelect ошибка #" , GetLastError () );
Sleep ( 3000 );
RefreshRates ();
return ;
}
} // end for//--- Открываем ордер если есть сигналwhile (sell_open)
{
//--- нормализация лота
lot = Normalize_Lot(Lots);
//--- проверка на наличие свободной маржиif ( AccountFreeMarginCheck ( Symbol (),OP_SELL, lot) <= 0 || GetLastError () == 134 )
{
Print ( "Недостаточно свободной маржи для открытия ордера" );
sell_open = false;
break ;
}
min_level = MarketInfo ( Symbol (), MODE_STOPLEVEL );
if ( OrderSend ( Symbol (), OP_SELL, lot, NormalizeDouble (Bid, Digits ), slippage,
NormalizeDouble (Ask + MathMax (stop_loss_sell, min_level) * Point , Digits ),
NormalizeDouble (Ask - MathMax (take_profit_sell, min_level) * Point , Digits ),
DoubleToStr (Magic, 0 ), Magic, 0 , Blue ) > 0 )
{
PlaySound ( "Wait.wav" );
sell_open = false; // ордер открытbreak ;
}
else
{
int Error = GetLastError (); // Не получилось :(switch (Error) // Преодолимые ошибки
{
case138 : Alert ( "Ошибка: " ,Error, " Новые цены." );
RefreshRates ();
continue ;
case135 : Alert ( "Ошибка: " ,Error, " Цена изменилась." );
RefreshRates ();
continue ;
case136 : Alert ( "Нет цен." );
while ( RefreshRates () == false)
Sleep ( 500 );
continue ;
case146 : Alert ( "Подсистема торговли занята." );
Sleep ( 500 );
RefreshRates ();
continue ;
default : Alert ( "Возникла ошибка " , Error, " Выход из подпрограммы." ); // Другие варианты ошибок
} // end switch
} // end elsebreak ;
} // end while
} // end Trade_SELL//+------------------------------------------------------------------+double Normalize_Lot( double lot) // Проверка на допустимое значение лота//+------------------------------------------------------------------+
{
double lot_min = MarketInfo ( Symbol (), MODE_MINLOT);
double lot_max = MarketInfo ( Symbol (), MODE_MAXLOT);
double lot_step = MarketInfo ( Symbol (), MODE_LOTSTEP);
if ( lot <= lot_min ) lot = lot_min; // минимальныйelseif ( lot >= lot_max ) lot = lot_max; // максимальныйelse lot = MathFloor ( lot / lot_step ) * lot_step ; // округление до ближайшего меньшегоreturn (lot);
}
//+------------------------------------------------------------------+int MathMax4( int i1, int i2, int i3, int i4) // Возврат максимального значения//+------------------------------------------------------------------+
{
int imax=i1;
if (i2>imax)imax=i2;
if (i3>imax)imax=i3;
if (i4>imax)imax=i4;
return (imax);
}
İyi günler, sevgili forum kullanıcıları. Danışmanı değiştirmek için yardıma ihtiyacınız var, yani. her şeyi olduğu gibi bırakın, sadece (al / sat) eylemini (al / sat) olarak değiştirin (sat / al), testlerim bir yükseliş trendinde, satış gerçekleştiğini ve bir düşüş trendinde, satın alın. bana hiçbir şey verme, ya da bir şey kaçırdım, ya da .... genel olarak, oh nid yardım Şimdiden teşekkür ederim.
iMA nasıl hesaplanır?
iMA işlevinin nasıl hesaplandığını (veya sınıflandırıldığını) bir yerde bulabilirsiniz.
Özellikle MODE_LWMA ile ilgileniyorum.
Bakmak ve zevkime göre düzeltmek istiyorum, ancak kaynak kodunu google'da bir şey işe yaramadı
https://docs.mql4.com/ru/indicators/iMA
Bir formüle ihtiyacınız var, böylece Google da onu kolayca bulur.
https://docs.mql4.com/en/indicators/iMA
Bir formüle ihtiyacınız var, böylece Google da onu kolayca bulur.
Yoksa "doğrusal ağırlıklı" terimini anlamıyor musunuz?
iMA işlevinin nasıl hesaplandığını (veya sınıflandırıldığını) bir yerde bulabilirsiniz.
Özellikle MODE_LWMA ile ilgileniyorum.
Bakmak ve zevkime göre düzeltmek istiyorum, ancak kaynak kodunu google'da bir şey işe yaramadı
Tünaydın!
İlk deney olarak, aşağıdaki algoritmayı uygulamaya karar verdim: Bollinger bantları dar bir koridorda birleştikten sonra, bir süre sonra piyasada yukarı veya aşağı keskin bir hareket olacağını bekleyebiliriz. Expert Advisor'da Bollinger Bantlarının durumunu analiz ediyorum ve yakın olduklarında ( Delta puanları ), piyasanın iyileşeceğini umarak aşağı yönde (alt satırın altındaki StepOpen noktalarında) bekleyen bir satış emri veriyorum . bu yönde keskin bir şekilde hareket edecektir. Piyasa diğer yöne gittiyse, bu emri silmeniz yeterlidir.
Algoritma kararsız, bazen kısa sürede iki emir açıyor, sürekli OrderSend Error 130 ve OrderSend Error 138 hataları üretiyor ve piyasa ters yönde hareket ederse açık emirleri silmek hiç çalışmıyor.Tavsiye konusunda yardım için büyük bir istek! Teşekkür ederim!
Victor İvanoviç!
O kadar yorum var neden link vermedin Kodu girdiler... Neden?
//--Ana kodunuz
ÖncekiZaman=Zaman[0]; // Sıfır çubuğunun açılış zamanını hatırla
Bir bar açma kurulumunuz varsa, işte bir şablon, işe yarıyor.
Büyük bir rica Bu işlevi danışmana kendiniz girebilir misiniz? Resim, bir çubukta açılan 3 siparişi göstermektedir. Ve sadece bir taneye ihtiyacın var. Kodu düzeltemiyorum. TEŞEKKÜRLER.
Herkese selam )))
Giriş noktasından kaç kez geçerse geçsin, siparişlerin açılmasını günde 1 ile sınırlamak için danışmana yardım edin...
Açmadan önce son kapatılan siparişin geçmişini kontrol edeceğim ve eğer eşleşirse açmamak için bir tür yazmaya çalışıyorum ...
for(int i=0;i<OrdersTotal();i++)
{
if( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)==true)
{
if(OrderCloseTime()==Gün()
kırmak;
}
bir şey berbat, lütfen lamochinka'ya yardım et))))
bir bar sitesinde sipariş verin: mql4.com
https://www.mql5.com/ru/forum/102366/page3
Danışmanı değiştirmek için yardıma ihtiyacınız var, yani. her şeyi olduğu gibi bırakın, sadece (al / sat) eylemini (al / sat) olarak değiştirin (sat / al), testlerim bir yükseliş trendinde, satış gerçekleştiğini ve bir düşüş trendinde, satın alın. bana hiçbir şey verme, ya da bir şey kaçırdım, ya da .... genel olarak, oh nid yardım
Şimdiden teşekkür ederim.