MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 32
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Eh, bu başka bir konu, şimdi %1'in neye göre olduğu açık;)
EA, son X çubuğu için minimum ve maksimum hesaplar ve bunlara siparişler verir. Ayrıca, maksimum düşüş veya minimum artış olduğunda, ilgili siparişi silmeniz ve yeni verileri kullanarak açmanız gerekir.
Gecikmeleri ne zaman değiştirdiğinizi tam olarak anlamadım, ancak minimum fiyat mevcut BuyLimit'i ayarlama fiyatından daha yüksekse, bunu yeni Min fiyatla değiştirmeniz gerekecek şekilde yaptım.
SellLimit için - ayna.
Ve bu doğru ya da değil - siz daha iyi bilirsiniz - herhangi bir şey olup olmadığını kontrol edin ve düzeltin - Kodu yeni yazdım, ama hiç kontrol etmedim - Bir değişiklik eklemenizi ve algoritmanın ve kodun doğruluğunu kontrol etmenizi sağlayacağım. genel.
input double LotB= 0.1 ; // Лот Buy
input double LotS= 0.1 ; // Лот Sell
input int Pointsl= 100 ; // StopLoss в пунктах
input int Pointtp= 100 ; // TakeProfit в пунктах
input int NumBars= 10 ; // Количество баров для поиска Max/Min
input int Magic= 100500 ; // Magic
//--- global variables
struct DataPendingOrder
{
int number; // Количество
double price_set; // Цена установки
};
struct DataPending
{
DataPendingOrder buy_limit; // BuyLimit
DataPendingOrder buy_stop; // BuyStop
DataPendingOrder sell_limit; // SellLimit
DataPendingOrder sell_stop; // SellStop
};
struct DataOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
DataPending order; // Данные отложенного ордера
};
DataOrders getData; // Данные ордеров и позиций
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
numBars=(NumBars< 1 ? 1 :NumBars> Bars ? Bars :NumBars);
pointsl=(Pointsl< 0 ? 0 :Pointsl);
pointtp=(Pointtp< 0 ? 0 :Pointtp);
double minLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
double maxLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders( Symbol (),Magic,getData);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice= 0.0 , minPrice= DBL_MAX ;
for ( int i= 0 ; i<numBars; i++) {
double max_i= iHigh ( Symbol (), PERIOD_CURRENT ,i);
if (max_i>maxPrice) maxPrice=max_i;
double min_i= iLow ( Symbol (), PERIOD_CURRENT ,i);
if (min_i<minPrice) minPrice=min_i;
}
//--- если нету рыночных Buy
if (getData.buy== 0 ) {
//--- если нет отложенного BuyLimit
if (getData.order.buy_limit.number== 0 ) {
double slB=(pointsl== 0 ? 0 : NormalizeDouble (minPrice-pointsl* Point (), Digits ()));
double tpB=(pointtp== 0 ? 0 : NormalizeDouble (minPrice+pointtp* Point (), Digits ()));
ResetLastError ();
int ticketUP= OrderSend ( Symbol (), OP_BUYLIMIT , lotB, minPrice, 3 , slB, tpB, "" , Magic, 0 , clrRed );
if (ticketUP==- 1 ) Print ( "ERROR SETTING OP_BUYLIMIT :" , GetLastError ());
else Print ( "OP_BUYLIMIT OK" );
}
//--- если есть BuyLimit
else {
//--- если цена Min больше цены установки BuyLimit
if (minPrice>getData.order.buy_limit.price_set) {
// модифицировать BuyLimit - поставить его на цену minPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//--- если нету рыночных Sell
if (getData.sell== 0 ) {
//--- если нет отложенного SellLimit
if (getData.order.sell_limit.number== 0 ) {
double slS=(pointsl== 0 ? 0 : NormalizeDouble (maxPrice+pointsl* Point (), Digits ()));
double tpS=(pointtp== 0 ? 0 : NormalizeDouble (maxPrice-pointtp* Point (), Digits ()));
ResetLastError ();
int ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxPrice, 3 , slS, tpS, "" , Magic, 0 , clrBlue );
if (ticketD==- 1 ) Print ( "ERROR SETTING OP_SELLLIMIT :" , GetLastError ());
else Print ( "OP_SELLLIMIT OK" );
}
//--- если есть SellLimit
else {
//--- если цена Max меньше цены установки SellLimit
if (maxPrice<getData.order.sell_limit.price_set) {
// модифицировать SellLimit - поставить его на цену maxPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//---
string a=(numBars== 1 )? "bar: " : IntegerToString (numBars, 1 )+ " bar's: " ;
Comment ( "Last " , a, "max " , DoubleToStr (maxPrice, Digits ()), ", min " , DoubleToStr (minPrice, Digits ()), "." );
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders( string symbol_name, int magic_number, DataOrders &data_of) {
ZeroMemory (data_of);
for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
if ( OrderSelect (i, SELECT_BY_POS )) {
if ( OrderMagicNumber ()!=magic_number) continue ;
if ( OrderSymbol ()!=symbol_name) continue ;
//--- рыночные позиции
if ( OrderType ()== OP_BUY ) data_of.buy++;
if ( OrderType ()== OP_SELL ) data_of.sell++;
//--- отложенные ордера
if ( OrderType ()== OP_BUYLIMIT ) { data_of.order.buy_limit.number++; data_of.order.buy_limit.price_set= OrderOpenPrice (); }
if ( OrderType ()== OP_BUYSTOP ) { data_of.order.buy_stop.number++; data_of.order.buy_stop.price_set= OrderOpenPrice (); }
if ( OrderType ()== OP_SELLLIMIT ) { data_of.order.sell_limit.number++; data_of.order.sell_limit.price_set= OrderOpenPrice (); }
if ( OrderType ()== OP_SELLSTOP ) { data_of.order.sell_stop.number++; data_of.order.sell_stop.price_set= OrderOpenPrice (); }
}
}
}
//+------------------------------------------------------------------+
umarım anlarsın
Kurulum fiyatını değiştirip yeni seviyeye göre bir alımla durdurmak varken neden silesiniz?
Yeni çalışmaya başladım ve silme seçeneği, işlevin uygulamasını incelemek amacıyla yapıldı, neden çalışmadığı sorusu ortaya çıktı.
Cevap verdiğiniz için hepinize teşekkürler.
Dış parametreleri sıfırlama komutunun neye benzemesi gerektiğini bana kim söyleyebilir?
nasıl görünmeli
1) Komutun tetiklenmesi için listede bir dizi gerekli koşul seçilir, sipariş açma diyelim
2) Bir emir açılır ve bu komut artık hiçbir koşulda çalışmaz. İlkenin kendisinin listeye dağılmış olması gerektiğinden, bilete ve sipariş sayısına göre filtreleme bir seçenek değildir.
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Mesafe*Nokta() ) ise GrossMA1[0] ise buradaki hata nedir. MA1[0] GrossMA2[1] MA2[1] Hareketlerin kesişimi + hareketleri geçtikten sonra mesafeye göre bir filtre kullanılır. Bu koşul ne ölçüde doğrudur?
GrossMA1 ve GrossMA2 size ne verirse, büyük olasılıkla bir fark vardır, sonunda şöyle bir şey elde edersiniz:
MA1 = 1.0050
if (MA1 > 0.0052) // yani fiyatın kendisi değil, farkı, yani karşılaştırma yanlış
GrossMA1 ve GrossMA2 size ne verir, büyük olasılıkla bir fark vardır, sonunda şöyle bir şey elde edersiniz:
MA1 = 1.0050
if (MA1 > 0.0052) // yani fiyatın kendisi değil, farkı, yani karşılaştırma yanlış
GrossMA1 ve GrossMA2 size ne verirse, büyük olasılıkla bir fark vardır, sonunda şöyle bir şey elde edersiniz:
MA1 = 1.0050
if (MA1 > 0.0052) // yani fiyatın kendisi değil, farkı, yani karşılaştırma yanlış
FRMA2= iMA ( Symbol (), 0 , Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1 );
FMA1= iMA ( Symbol (), 0 , Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0 );
FMA2= iMA ( Symbol (), 0 , Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1 );
GrossMA1= iMA ( Symbol (), 0 , Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0 );
GrossMA2= iMA ( Symbol (), 0 , Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1 );
GrossMA1 ve GrossMA2 size ne verirse, büyük olasılıkla bir fark vardır, sonunda şöyle bir şey elde edersiniz:
MA1 = 1.0050
if (MA1 > 0.0052) // yani fiyatın kendisi değil, farkı, yani karşılaştırma yanlış
Tür. Söyle bana, hata nerede?
extern int pointsl= 100 , pointtp= 100 , MagicB= 1111 , MagicS= 2222 , bars= 10 ; extern double lotB= 0.1 , lotS= 0.1 ;
double slB, tpB, slS, tpS; double x= 0 , z= 0 ; int ticketUP, ticketD;
void OnTick ()
{
double maxpr1=- 9999 ; double minpr1= 9999 ;
for ( int shift1= 0 ; shift1<bars; shift1++)
{ double i= iHigh ( Symbol (), PERIOD_CURRENT , shift1);
if (i>maxpr1){maxpr1=i;}}
for ( int shiftA1= 0 ; shiftA1<bars; shiftA1++)
{ double y= iLow ( Symbol (), PERIOD_CURRENT , shiftA1);
if (y<minpr1) {minpr1=y;}}
slS= NormalizeDouble (maxpr1+pointsl* Point , 5 );
tpS= NormalizeDouble (maxpr1-pointtp* Point , 5 );
ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxpr1, 3 , slS, tpS, "" , MagicS, 0 , Blue);
if (ticketD==- 1 ) Print ( "ERROR OP_SELL" ); else Print ( "OP_SELL OK" );
}
Her şey çalışıyor, maxpr1 fiyatına sipariş veriyor.
Sonra aynı şeyi yapmak istiyorum, ancak minpr1 fiyatına:
double slB, tpB, slS, tpS; double x= 0 , z= 0 ; int ticketUP, ticketD;
void OnTick ()
{
double maxpr1=- 9999 ; double minpr1= 9999 ;
for ( int shift1= 0 ; shift1<bars; shift1++)
{ double i= iHigh ( Symbol (), PERIOD_CURRENT , shift1);
if (i>maxpr1){maxpr1=i;}}
for ( int shiftA1= 0 ; shiftA1<bars; shiftA1++)
{ double y= iLow ( Symbol (), PERIOD_CURRENT , shiftA1);
if (y<minpr1) {minpr1=y;}}
slS= NormalizeDouble (minpr1+pointsl* Point , 5 );
tpS= NormalizeDouble (minpr1-pointtp* Point , 5 );
ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, minpr1, 3 , slS, tpS, "" , MagicS, 0 , Blue);
if (ticketD==- 1 ) Print ( "ERROR OP_SELL" ); else Print ( "OP_SELL OK" );
}
130 hatası yazıyor (yanlış duruyor). Neyi yanlış yapıyorum?