Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 100

 

Herkese merhaba, lütfen danışmanın kodunda bir hata bulmama yardım edin, her şeyi inceledim, her şey kodda doğru yazılmış gibi görünüyor, ancak bir nedenden dolayı program doğru ticaret yapmıyor! Fikir şudur: EA aynı yönde iki uzun mum aramalıdır (mumlar arasındaki uzunluk EA'da düzenlenir, yani yöne bağlı olarak iki minimum veya maksimum mum arasında), fiyat kırılırsa Son mumun minimum veya maksimum ters yönde, bir anlaşma açılmalıdır (Dosyaya ekli çizelgede durumların örnek fotoğrafları). EA, bu tür her uygun durumda alım satım açmalıdır ve bir nedenden dolayı alım satımları yalnızca günler arasındaki alım satım pencerelerinde açar. Programcılar için zor olmayan durum budur, lütfen yardım edin, hatayı düzeltin. Aşağıdaki danışman koduna ve ekteki dosyaya bakın.


//+------------------------------------------- ------------------------------------------------+

//| Space_Candles.mq4 |

//| Telif hakkı 2017, Vladimir |

//| vk.com/id229534564 |

//| Posta: Vladim120385@yandex.ru |

//+------------------------------------------- ------------------------------------------------+

#property telif hakkı "Telif hakkı 2017, Vladim"

#özellik bağlantısı "vk.com/id229534564"

#özellik sürümü "1.00"

#mülkiyet katı


//--- EA parametreleri

harici string parametreEA = ""; // Parametreler EA

dış çift hacim = 0.01; // Ses

harici çift stopLoss = 5; // kaybı durdurmak

harici çift alProfit = 1.5; // kar almak

dış çift maxSpacing = 150; // MaxSpacing

dış çift minSpacing = 30; // MinSpacing

harici çift sondaki durdurma = 0; // sondaki durdurma

harici int büyü = 127; // büyü


//--- global değişkenler

tarihsaat newCandle;

int-ipucu;


//+------------------------------------------- ------------------------------------------------+

int OnInit()

{

dönüş(INIT_SUCCESSED);

}

//+------------------------------------------- ------------------------------------------------+

geçersiz OnDeinit(const int nedeni)

{

}

//+------------------------------------------- ------------------------------------------------+

geçersiz OnTick()

{

if(newCandle != Zaman[0]) FindPattern();

newCandle = Zaman[0];

}

//+------------------------------------------- ------------------------------------------------+

void OpenOrder(int type) // Bir piyasa emri aç

{

if(type == OP_BUY) if(OrderSend(_Symbol, OP_BUY, hacim, Sor, 0, 0, 0, "", magic, 0))) SetSLTP(OP_BUY);

if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, "", magic, 0))) SetSLTP(OP_SELL);

}

//+------------------------------------------- ------------------------------------------------+

void SetSLTP(int type) // Stop emirlerini ayarla

{

çift sl = 0;

çiftp = 0;

if(tür == OP_BUY)

for(int i = 0; i < OrdersTotal(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_BUY && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Düşük[1] - stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() + (OrderOpenPrice() - Düşük[1]) * takeProfit, Rakamlar);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) dönüş;

}

if(tür == OP_SEL)

for(int i = 0; i < OrdersTotal(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_SELL && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Yüksek[1] + stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() - (Yüksek[1] - OrderOpenPrice()) * takeProfit, Digits);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) dönüş;

}

}

//+------------------------------------------- ------------------------------------------------+

void FindPattern() // Mumlar arasında büyük bir mesafe aranıyor

{

if(Yüksek[1] < Yüksek[2] && Teklif > Yüksek[1] && Düşük[1] < Düşük[2])

{

çift boşluk = NormalizeDouble((Yüksek[2] - Yüksek[1]) / _Point, 0);

if(maxSpacing >= boşluk && minSpacing <= boşluk)

OpenOrder(OP_BUY);

}

if(Düşük[1] > Düşük[2] && Teklif < Düşük[1] && Yüksek[1] > Yüksek[2])

{

çift boşluk = NormalizeDouble((Düşük[1] - Düşük[2]) / _Point, 0);

if(maxSpacing >= boşluk && minSpacing <= boşluk)

OpenOrder(OP_SELL);

}

{

if (TrailingStop!=0) TrailingStop();

}

}

//+------------------------------------------- ------------------------------------------------+

void TrailingStop()

{

çift StLo,OSL,OOP;

bool hatası=doğru;

(int i=0; i<SiparişToplam(); i++) için

{

if (Sipariş Seçimi(i, SELECT_BY_POS))

{

ipucu = OrderType();

if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

{

OSL = NormalizeDouble(OrderStopLoss(),Digits);

OOP = NormalizeDouble(OrderOpenPrice(), Rakamlar);

if (ipucu==0)

{

StLo = NormalizeDouble(Teklif - TrailingStop*Point,Digits);

(StLo < OOP) devam ederse;

if(StLo>OSL)

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,Beyaz);


}

if (ipucu==1)

{

StLo = NormalizeDouble(Sor + TrailingStop*Point,Rakamlar);

(StLo > OOP) devam ederse;

if (StLo < OSL || OSL==0 )

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,Beyaz);

}

if (!error) Alert("Error TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo);

}

}

}

}

//+------------------------------------------- ------------------------------------------------+

Dosyalar:
 
Vladim1203 :

Herkese merhaba, lütfen danışmanın kodunda bir hata bulmama yardım edin, her şeyi inceledim, her şey kodda doğru yazılmış gibi görünüyor, ancak bir nedenden dolayı program doğru ticaret yapmıyor! Fikir şudur: EA aynı yönde iki uzun mum aramalıdır (mumlar arasındaki uzunluk EA'da düzenlenir, yani yöne bağlı olarak iki minimum veya maksimum mum arasında), fiyat kırılırsa Son mumun minimum veya maksimum ters yönde, bir anlaşma açılmalıdır (Dosyaya ekli çizelgede durumların örnek fotoğrafları). EA, bu tür her uygun durumda alım satım açmalıdır ve bir nedenden dolayı alım satımları yalnızca günler arasındaki alım satım pencerelerinde açar. Programcılar için zor olmayan durum budur, lütfen yardım edin, hatayı düzeltin. Aşağıdaki danışman koduna ve ekteki dosyaya bakın.

Belki yeteri kadar, her konuda gönderiler oluşturdunuz ve aynı zamanda kendinizinkini oluşturdunuz.

 
kuzhakov :

Merhaba.
Danışmanın ticaretini zamana göre nasıl sınırlayacağımı söyle.
Forumdan birçok yol denedim ama hiçbir şey olmadı, yazılı olarak hiçbir şey anlamıyorum.
Parmağınızı doğrudan bir şeyin yerleştirileceği yere sokmanız önerilir.


başladıktan sonra koymak. ve uzman her gün terminalde belirtilen zaman aralığında işlem yapacak


 int val= Hour ();
 double min= Minute ();
 double Dl = val + min/ 100 ;  
 double L = xxxx+xxxx/ 100 ; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/ 100 ; //час + минуты вместо хххх - это конец времени
 if (Dl<L) return ;
 if (Dl>P) return ;
 
Vladim1203 :

Herkese merhaba, lütfen danışmanın kodunda bir hata bulmama yardım edin, her şeyi inceledim, her şey kodda doğru yazılmış gibi görünüyor, ancak bir nedenden dolayı program doğru ticaret yapmıyor! Fikir şudur: EA aynı yönde iki uzun mum aramalıdır (mumlar arasındaki uzunluk EA'da düzenlenir, yani yöne bağlı olarak iki minimum veya maksimum mum arasında), fiyat kırılırsa Son mumun minimum veya maksimum ters yönde, bir anlaşma açılmalıdır (Dosyaya ekli çizelgede durumların örnek fotoğrafları). EA, bu tür her uygun durumda alım satım açmalıdır ve bir nedenden dolayı alım satımları yalnızca günler arasındaki alım satım pencerelerinde açar. Programcılar için zor olmayan durum budur, lütfen yardım edin, hatayı düzeltin. Aşağıdaki danışman koduna ve ekteki dosyaya bakın.


alış ve satış girme koşulunu kontrol edin

 
Vladim1203 :

Herkese merhaba, lütfen danışmanın kodunda bir hata bulmama yardım edin, her şeyi inceledim, her şey kodda doğru yazılmış gibi görünüyor, ancak bir nedenden dolayı program doğru ticaret yapmıyor! Fikir şudur: EA aynı yönde iki uzun mum aramalıdır (mumlar arasındaki uzunluk EA'da düzenlenir, yani yöne bağlı olarak iki minimum veya maksimum mum arasında), fiyat kırılırsa Son mumun minimum veya maksimum ters yönde, bir anlaşma açılmalıdır (Dosyaya ekli çizelgede durumların örnek fotoğrafları). EA, bu tür her uygun durumda alım satım açmalıdır ve bir nedenden dolayı alım satımları yalnızca günler arasındaki alım satım pencerelerinde açar. Programcılar için zor olmayan durum budur, lütfen yardım edin, hatayı düzeltin. Aşağıdaki danışman koduna ve ekteki dosyaya bakın.

İlk önce danışmanın bir bölümünü, bulunan mumları grafikte işaretlemesi için yazmak daha iyidir - her şey netleşecektir. Ve sizin durumunuzda aşağıdaki satırlar gereksizdir:

 extern string paramEA    = "" ;     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit ()
{
   
   return ( INIT_SUCCEEDED );
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

Cemaatten yardım istemek...
*
Kalman filtre göstergesini forumdan indirdim (kaynak ekte).
Grafikte her şey yolunda.


Expert Advisor'da aşağıdaki satırla okumaya çalışırken



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Açıkça göstergeyle ilgili olmayan bir ve aynı sayıda çıktı verir:

Ne olabilirdi ?

Dosyalar:
 
MikeZv :

Toplumdan yardım istemek...
*
Kalman filtre göstergesini forumdan indirdim (kaynak ekte).
Grafikte her şey yolunda.


Expert Advisor'da aşağıdaki satırla okumaya çalışırken



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Açıkça göstergeyle ilgili olmayan bir ve aynı sayıda çıktı verir:

Ne olabilirdi ?

BOŞ_VALUE

Gösterge arabelleğinde boş değer

2147483647 (0x7FFFFFFF)

 
Alekseu Fedotov :

BOŞ_VALUE

Gösterge tamponundaki boş değer

2147483647 (0x7FFFFFFF)


:) zaten buldum...
Neden çıkıyor?

 
MikeZv :

:) zaten buldum...
Neden çıkıyor?


2 renk olduğu için gösterge 2 diziye sahiptir. Çubuk üzerinde ilk rengin bir satırı varken, ikinci rengin bulunduğu dizi EMPTY_VALUE değerine eşittir,

yani, istekten sonra iValue=iCustom(NULL,timeframe,"Kalmanfilter", 4,1,1 ,0,1);

iValue = EMPTY_VALUE, 1. çubuktaki satırın turuncu olduğu anlamına gelir. (çünkü mavi dizi = EMPTY_VALUE)

 
Nikolay Ivanov :

2 renk olduğu için gösterge 2 diziye sahiptir. Çubuk üzerinde ilk rengin bir satırı varken, ikinci rengin bulunduğu dizi EMPTY_VALUE değerine eşittir,

yani, istekten sonra iValue=iCustom(NULL,timeframe,"Kalmanfilter", 4,1,1 ,0,1);

iValue = EMPTY_VALUE, 1. çubuktaki satırın turuncu olduğu anlamına gelir. (çünkü mavi dizi = EMPTY_VALUE)


Teşekkürler Nikolai...
Her iki hattan da aldım.
Sonra onları bir araya getirdim (sol bir tampon). Aynı sonuç.
*
Aşağıdaki soru ortaya çıktı:
Göstergede draw_begin=500 değişkeni vardır, yani. grafiğin çizildiği sondan (en taze mumdan) mum sayısı.
Ve iCustom() yöntemini kullanarak gösterge değerini çıkardığımızda, bu 500 parça hangi mumdan sayılır?
Neden önemlidir - draw_begin sadece çizim için değil, aynı zamanda gösterge hesaplamasına da katılır...