Uzman Danışmanlardan birinde, bir şekilde 130 "Yanlış Durak" hata sayısını büyük ölçüde azaltmam gerekiyordu. STOPLEVEL adlı ticaret sunucusu ayarı tarafından belirlenen minimum değerlerinde bir sınır olduğu, küçük duraklar ve alımlar kullanmaya değmediğine dair argümanlarım müşteriyi ikna etmedi. Sonuçta, sunucuya bir ticaret talebi göndermeden önce bu hatayı bir şekilde işlemenin mümkün olduğunu söyledi. Ben savuşturdum, hata yoksa nasıl halledilir. Ama düşünce beyne girdi ve çalışmaya başladı ve bu işlevi doğurdu.
CorrectingPrice() işlevi, STOPLEVEL gereksinimi altındaki emirlerin ve pozisyonların ana fiyat seviyelerini sunucuya bir ticaret talebi göndermeden önce, yani ilk verileri hazırlama aşamasında düzeltmek için tasarlanmıştır.
Tüm fonksiyon parametreleri gereklidir, varsayılan değerler yoktur. Ek olarak, son üç parametre referans olarak iletilir, yani fonksiyonun sonucunu da içereceklerdir. İşlev aşağıdaki parametreleri alır:
sy - İşlem aracının adı. Boş bir değer "" veya NULL, mevcut ticaret aracı (sembol) anlamına gelir.
op - Ticaret işlemi. Geçerli değerler: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP ve OP_SELLSTOP.
pp - Bir pozisyon/sipariş açma/ayarlama fiyatı.
sl - StopLoss fiyat seviyesi.
tp - TakeProfit fiyat seviyesi.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 02.07.2013 |//| Описание : Выполняет корректирование ценовых уровней под STOPLEVEL. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование торгового инструмента |//| op - торговая операция |//| pp - цена открытия/установки |//| sl - ценовой уровень StopLoss |//| tp - ценовой уровень TakeProfit |//+----------------------------------------------------------------------------+void CorrectingPrice( string sy, int op, double & pp, double & sl, double & tp) {
if (sy== "" || sy== "0" ) sy= Symbol ();
RefreshRates();
int di=MarketInfo(sy, MODE_DIGITS);
int msl=MarketInfo(sy, MODE_STOPLEVEL);
int sp=MarketInfo(sy, MODE_SPREAD);
double mp=MarketInfo(sy, MODE_POINT);
double pa=MarketInfo(sy, MODE_ASK);
double pb=MarketInfo(sy, MODE_BID);
double ds= NormalizeDouble (pp-sl, di);
double dp= NormalizeDouble (pp-tp, di);
if (msl==0) msl=2*sp;
switch (op) {
case OP_BUY:
pp=pa;
sl=pp-ds;
tp= NormalizeDouble (pp-dp, di);
if (sl>pp-msl*mp) sl=pp-msl*mp;
if (tp> 0 && tp<pp+msl*mp) tp=pp+msl*mp;
break ;
case OP_SELL:
pp=pb;
sl= NormalizeDouble (pp-ds, di);
tp=pp-dp;
if (sl> 0 && sl<pp+msl*mp) sl=pp+msl*mp;
if (tp>pp-msl*mp) tp=pp-msl*mp;
break ;
case OP_BUYLIMIT:
if (pp>pa-msl*mp) {
pp=pa-msl*mp;
sl=pp-ds;
tp= NormalizeDouble (pp-dp, di);
}
if (sl>pp-msl*mp) sl=pp-msl*mp;
if (tp> 0 && tp<pp+msl*mp) tp=pp+msl*mp;
break ;
case OP_BUYSTOP:
if (pp<pa+msl*mp) {
pp=pa+msl*mp;
if (sl> 0 ) sl=pp-ds;
if (tp> 0 ) tp= NormalizeDouble (pp-dp, di);
}
if (sl>pp-msl*mp) sl=pp-msl*mp;
if (tp> 0 && tp<pp+msl*mp) tp=pp+msl*mp;
break ;
case OP_SELLLIMIT:
if (pp<pb+msl*mp) {
pp=pb+msl*mp;
sl= NormalizeDouble (pp-ds, di);
tp=pp-dp;
}
if (sl> 0 && sl<pp+msl*mp) sl=pp+msl*mp;
if (tp>pp-msl*mp) tp=pp-msl*mp;
break ;
case OP_SELLSTOP:
if (pp>pb-msl*mp) {
pp=pb-msl*mp;
sl= NormalizeDouble (pp-ds, di);
tp=pp-dp;
}
if (sl> 0 && sl<pp+msl*mp) sl=pp+msl*mp;
if (tp>pp-msl*mp) tp=pp-msl*mp;
break ;
default :
Message( "CorrectingPrice(): Неизвестная торговая операция!" );
break ;
}
}
Uzman Danışmanlardan birinde, bir şekilde 130 "Yanlış Durak" hata sayısını büyük ölçüde azaltmam gerekiyordu. STOPLEVEL adlı ticaret sunucusu ayarı tarafından belirlenen minimum değerlerinde bir sınır olduğu, küçük duraklar ve alımlar kullanmaya değmediğine dair argümanlarım müşteriyi ikna etmedi. Sonuçta, sunucuya bir ticaret talebi göndermeden önce bu hatayı bir şekilde işlemenin mümkün olduğunu söyledi. Ben savuşturdum, hata yoksa nasıl halledilir. Ama düşünce beyne girdi ve çalışmaya başladı ve bu işlevi doğurdu.
CorrectingPrice() işlevi, STOPLEVEL gereksinimi altındaki emirlerin ve pozisyonların ana fiyat seviyelerini sunucuya bir ticaret talebi göndermeden önce, yani ilk verileri hazırlama aşamasında düzeltmek için tasarlanmıştır.
Tüm fonksiyon parametreleri gereklidir, varsayılan değerler yoktur. Ek olarak, son üç parametre referans olarak iletilir, yani fonksiyonun sonucunu da içereceklerdir. İşlev aşağıdaki parametreleri alır:
sy - İşlem aracının adı. Boş bir değer "" veya NULL, mevcut ticaret aracı (sembol) anlamına gelir.
op - Ticaret işlemi. Geçerli değerler: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP ve OP_SELLSTOP.
pp - Bir pozisyon/sipariş açma/ayarlama fiyatı.
sl - StopLoss fiyat seviyesi.
tp - TakeProfit fiyat seviyesi.
Igor, bazı DC'ler artık sıfır değerine sahip StopLevel yerine Spread*2 kullanıyor. Kodu gözden geçirdikten sonra, içinde bu durum için bir kontrol fark etmedim. Böyle bir durumu kontrol etmek için kodu düzeltmek güzel olurdu, aksi takdirde aynı hatalar olacaktır 130
artmedia70 : Igor, bazı DC'ler artık sıfır değerine sahip StopLevel yerine Spread*2 kullanıyor. Kodu gözden geçirdikten sonra, içinde bu durum için bir kontrol fark etmedim. Böyle bir durumu kontrol etmek için kodu düzeltmek güzel olurdu, aksi takdirde aynı hatalar olacaktır 130
Artyom, ben böyle DC'ler görmedim... Bir kaç parçayı özel mesaj olarak gönderebilir misiniz? Ticaret kurallarını okudum...
Yoksa yapmak daha mı kolay. Bana kendiniz söyleyin, böyle bir değişiklik kullanmak yeterince doğru mu?
int msl=MarketInfo(sy, MODE_STOPLEVEL);
int sp=MarketInfo(sy, MODE_SPREAD);
if (msl== 0 ) msl= 2 *sp;
GÜNCELLEME : CorrectingPrice() işlevinde bir düzeltme yapıldı.
CorrectTF() işlevi için uzun süre eleştirildim, işlevselliği beyan edilenle uyuşmadı. Ve gerçekten de, zaman çerçevesini sadece en yakın olana değil, en yakın minimuma ayarlar. Standart zaman dilimleri arasındaki aritmetik ortalamaları hesapladım ve işlevi açıklamaya uyacak şekilde yeniden yazdım.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 21.05.2013 |//| Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4. |//+----------------------------------------------------------------------------+//| Параметры: |//| TimeFrame - таймфрейм (количество минут). |//+----------------------------------------------------------------------------+int CorrectTF( int TimeFrame) {
if (TimeFrame> 1 && TimeFrame< 3 ) return ( PERIOD_M1 );
if (TimeFrame>= 3 && TimeFrame< 10 ) return ( PERIOD_M5 );
if (TimeFrame>= 10 && TimeFrame< 23 ) return ( PERIOD_M15 );
if (TimeFrame>= 23 && TimeFrame< 45 ) return ( PERIOD_M30 );
if (TimeFrame>= 45 && TimeFrame< 150 ) return ( PERIOD_H1 );
if (TimeFrame>= 150 && TimeFrame< 840 ) return ( PERIOD_H4 );
if (TimeFrame>= 840 && TimeFrame< 5760 ) return ( PERIOD_D1 );
if (TimeFrame>= 5760 && TimeFrame< 26640 ) return ( PERIOD_W1 );
if (TimeFrame>= 26640 ) return ( PERIOD_MN1 );
}
Artyom, ben böyle DC'ler görmedim... Bir kaç parçayı özel mesaj olarak gönderebilir misiniz? Ticaret kurallarını okudum...
fırlattı
Yoksa yapmak daha mı kolay. Bana kendiniz söyleyin, böyle bir değişiklik kullanmak yeterince doğru mu?
int msl=MarketInfo(sy, MODE_STOPLEVEL);
int sp=MarketInfo(sy, MODE_SPREAD);
if (msl== 0 ) msl= 2 *sp;
Tabii ki, bu doğru.
GÜNCELLEME : CorrectingPrice() işlevinde bir düzeltme yapıldı.
İgor, bunu Expert Advisors'da pratik olarak yapıyorum, her zaman önce verileri okuyorum ve istenilen değeri seviye değişkenine atıyorum, sonra onunla hesaplamaları kontrol ediyorum.
Bu, ancak bu kadar değil, sonuçta ortaya çıkan hatalarla diğer işlevlere çok sayıda gereksiz çağrı!
Eh, zaten hatalar yaptın...
Her şey basit ve net: Gerektiğinde kendiniz düzenleyin.
Buna benzeterek, bir şeyi tasvir edebilirsiniz ...
Güncelleme...
Ekli, ExistOPNearPrice() işlevini test etmek için bir komut dosyasıdır
Yaptım, doğru mu bilmiyorum.
Eh, zaten hatalar yaptın...
Her şey basit ve net: İhtiyacınıza göre kendiniz düzenleyin.
Yaptım, doğru mu bilmiyorum.
Düzeltme Fiyatı().
Düzeltme Fiyatı().
Igor, bazı DC'ler artık sıfır değerine sahip StopLevel yerine Spread*2 kullanıyor. Kodu gözden geçirdikten sonra, içinde bu durum için bir kontrol fark etmedim. Böyle bir durumu kontrol etmek için kodu düzeltmek güzel olurdu, aksi takdirde aynı hatalar olacaktır 130
Artyom, ben böyle DC'ler görmedim... Bir kaç parçayı özel mesaj olarak gönderebilir misiniz? Ticaret kurallarını okudum...
Yoksa yapmak daha mı kolay. Bana kendiniz söyleyin, böyle bir değişiklik kullanmak yeterince doğru mu?
GÜNCELLEME : CorrectingPrice() işlevinde bir düzeltme yapıldı.
CorrectTF() işlevinin yeni sürümü.
CorrectTF() işlevi için uzun süre eleştirildim, işlevselliği beyan edilenle uyuşmadı. Ve gerçekten de, zaman çerçevesini sadece en yakın olana değil, en yakın minimuma ayarlar. Standart zaman dilimleri arasındaki aritmetik ortalamaları hesapladım ve işlevi açıklamaya uyacak şekilde yeniden yazdım.
Artyom, ben böyle DC'ler görmedim... Bir kaç parçayı özel mesaj olarak gönderebilir misiniz? Ticaret kurallarını okudum...
fırlattı
Yoksa yapmak daha mı kolay. Bana kendiniz söyleyin, böyle bir değişiklik kullanmak yeterince doğru mu?
Tabii ki, bu doğru.
GÜNCELLEME : CorrectingPrice() işlevinde bir düzeltme yapıldı.
Artyom, ben böyle DC'ler görmedim... Bir kaç parçayı özel mesaj olarak gönderebilir misiniz? Ticaret kurallarını okudum...
Yoksa yapmak daha mı kolay. Bana kendiniz söyleyin, böyle bir değişiklik kullanmak yeterince doğru mu?
GÜNCELLEME : CorrectingPrice() işlevinde bir düzeltme yapıldı.
Merhaba arkadaşlar, kodları incelerken incelikleri iyi ve biraz zorlukla seçemiyorum.
Anladığım kadarıyla sipariş vermeden önce parametreleri düzeltmek için bu fonksiyona bir çağrı yapmak gerekiyor.
sipariş açmak için bir satır var:
if(buy == true && Open[0]>UpTr && Trade) {
buy=OrderSend(Symbol(),OP_BUYSTOP,LOT(), NormalizeDouble (op,Digits),slippage,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),"T",Magic,0,MediumBlue);
bu bir itiraz mı olmalı? Ve nasıl doğru yapılır. Yoksa bu komutun CorrectingPrice() işlevine ihtiyacı yok mu?
Şimdiden teşekkür ederim.