KimIV'ten faydalı özellikler - sayfa 118

 
borilunad :
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.

 
KimIV :


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.

 //+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг существования позиции или ордера в заданном    | 
//|           : диапазоне от заданной цены                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    op - торговая операция               (    -1      - любая операция)     |
//|    mn - MagicNumber                     (    -1      - любой магик)        |
//|    price - заданная цена                (    -1 - текущая цена рынка       |  
//|    ds - расстояние в пунктах от цены    (  1000000   - по умолчанию)       |
//+----------------------------------------------------------------------------+
bool ExistOPNearMarkets( string sy= "" , int op=- 1 , int mn=- 1 , double price = - 1 , int ds= 1000000 ) {
   int i, k= OrdersTotal (), ot;

   if (sy== "" || sy== "0" ) sy= Symbol ();
   double p=MarketInfo(sy, MODE_POINT);
   if (p== 0 ) if ( StringFind (sy, "JPY" )< 0 ) p= 0.00001 ; else p= 0.001 ;
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
       if (OrderSymbol()==sy) {
         if (mn< 0 || OrderMagicNumber()==mn) {
           if (op==OP_BUY && (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP)) {
             if ((price< 0 && MathAbs (MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) ||
                (price> 0 && MathAbs (price-OrderOpenPrice())<ds*p)) 
               {
                 return (True);
               }
          }
           if (op==OP_SELL && (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP)) {
             if ((price< 0 && MathAbs (OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) ||
                (price> 0 && MathAbs (OrderOpenPrice()-price)<ds*p)) 
               {
                 return (True);
               }
          }
        }
      }
    }
  }
   return (False);
}
 
artmedia70 :

Eh, zaten hatalar yaptın...

Her şey basit ve net: İhtiyacınıza göre kendiniz düzenleyin.

Teşekkür ederim! Evet, başka şekillerde yaptım.
 
khorosh :

Yaptım, doğru mu bilmiyorum.

Evet gibi görünüyor, doğru ... evrensel olarak ortaya çıktı)))
 

Düzeltme Fiyatı().


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 ;
  }
}

 
KimIV :

Düzeltme Fiyatı().


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ş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.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 );
}
 
KimIV :


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.
 
KimIV :


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.

Neden: