KimIV'ten faydalı özellikler - sayfa 114

 

Tünaydın.

Programlamada yeniyim, belki biri bana yardım edebilir.

Soru. Bir veya daha fazla açık sipariş var, bunların örneğin 20$'lık bir kârla kapatılacağı biliniyor.

20$'lık bir kârla siparişlerin hangi fiyattan kapatılacağını öğrenmeniz gerekiyor.

Açık lotların toplam hacmini hesaplıyoruz ve sonra?!

Bana nasıl yapacağımı söyleme.

Belki zaten hazır bir işlev vardır?

Şimdiden teşekkürler.

 
KimIV :

DistMarketAndPos() işlevini kullanma örnekleri.

Piyasanın ona en yakın konumdan ne kadar uzakta olduğunu belirleyen bir fonksiyona neden ihtiyacınız olsun ki? En az dört ana seçenek görüyorum:

  1. Satın alındı veya satıldı. Piyasa bize doğru hareket etti. Ve belli bir mesafeyi geçer geçmez mevcut pozisyonlar belli bir kazanç elde etti, bu yüzden hemen dolduruyoruz - tekrar aynı yöne giriyoruz.
  2. Satın alındı veya satıldı. Piyasa bize doğru hareket etti. Ve belli bir mesafe kateder etmez, mevcut pozisyonlar belli bir kazanç elde eder etmez, her şeyin olduğunu hemen anlıyoruz! Geri dönüş yakın! Dönüş zamanı. Mevcut pozisyonları kapatıp ters yönde açıyoruz.
  3. Satın alındı veya satıldı. Piyasa bize karşı çıktı. Ama nedense haklı olduğumuzdan eminiz ve en yakın giriş noktasından biraz uzaktayız, yani belirli bir kayıp seviyesinde ortalamayı alıyoruz - aynı yönde açıyoruz.
  4. Satın alındı veya satıldı. Piyasa bize karşı çıktı. Ve girdide bir hata olduğunu fark ettik. Bu nedenle, belirli bir kayıp seviyesinde sabitliyoruz ve diğer yönde açıyoruz.

not. Listelenen seçeneklerden herhangi birinin özel bir uygulamasına ihtiyaç duyan biri varsa, uygulamaları buraya yazın. Yukarıda saydıklarım çerçevesinde tüm isteklerimi yerine getireceğim.

ZY-ZY. Fragman, DistMarketAndPos() işleviyle deneme yapmak için bir komut dosyası içerir.


Merhaba KimIV, fonksiyon çok iyi çalışıyor, ters çeviriyorum, çalışıyor ama iki yarımı birleştiremiyorum.

     int start()

{

      if (DistMarketAndPos()>150)

{                                     

      OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,Ask+150*Point);

   }     

      return(0);

   }

int DistMarketAndPos(string sy="", int op=OP_BUY, int mn=-1) {

  double d, p;

  int i, k=OrdersTotal(), r=1000000;


  if (sy=="" || sy=="0") sy=Symbol();

  p=MarketInfo(sy, MODE_POINT);

  if (p==0) if (StringFind(sy, "")<0) p=0.00001; else p=0.01;

  for (i=0; i<k; i++) {

    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {

        if (mn<0 || OrderMagicNumber()==mn) {

          if (OrderType()==OP_BUY) {

            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;

            if (r>d) r=NormalizeDouble(d, 0);

          }

          if (OrderType()==OP_SELL) {

            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;

            if (r>d) r=NormalizeDouble(d, 0);

          }

        }

      }

    }

  }

return (r);

}  


 

Lütfen bana çevirin, herkes doğru olmadığını söylüyor ama işe yarıyor.
 
Yeni başlayanlar, bunun için özel olarak açılmış bir başlıkta soru sorun.
 

Message() işlevinin yeni sürümü.


Message() işlevi, burada yayınlandığı günden bu yana iki kez değişti. İlk değişiklik, Print() işleviyle uzman günlüğüne çıktıyı devre dışı bırakma ve bir dizi özdeş mesajdan yalnızca ilk mesajı görüntüleme yeteneğini ekledi. İkinci değişiklik, çıktı yönergelerini ekledi, yani mevcut Comment() ve Print() işlevlerine ek olarak Alert() , SendMail() ve SendNotification() kullanıldı. Bu gönderdiğim son değişiklik

Message() işlevi, çeşitli yönlerde bir metin mesajı çıktısı almak için tasarlanmıştır. Mevcut ticaret durumunu açıklamak, programın işleyişini kaydetmek, tüccara önemli değişiklikleri zamanında bildirmek vb. için hem hata ayıklama amacıyla hem de hazır geliştirmelerde kullanılabilir. İşlev, üç parametreyi kabul eder: son ikisi isteğe bağlıdır:
  • ms - Dize, çıktısı alınacak metin mesajı, iletilir.
  • nv - Mesajın çıktısının alınması gereken yönü belirten bir bayrak dizisi. Beş bayrak beş aşinalıktır. Her aşinalık sıfırla kapanır ve birer birer belirli bir çıkış yönünü açar. Soldan sağa sırasıyla Alert, Comment, Print, SendMail ve SendNotification'dır. Varsayılan değer "01100"dür, yani Yorum ve Yazdır etkindir, geri kalanı devre dışıdır.
  • am - Boolean, True - tüm mesajları göster, False - bir dizi aynı mesajdan yalnızca ilk mesajı göster. Varsayılan değer False'dır .

Uyarı ve Yazdır çıktı yönergeleri hakkında (bilinlik 1 ve 3), bir mesajı satır satır görüntüleyebileceklerine dikkat edilmelidir. Yani, mesaj metninde bir satır sonu varsa - "\n" kontrol karakteri, o zaman her satır bağımsız olarak görüntülenecektir. Ekteki test senaryosunu deneyin, beğeneceğinizi düşünüyorum :-)

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,   http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Вывод текстового сообщения.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ms - текст сообщения                                                    |
//|    nv - флаги направлений вывода сообщения:   (0-выкл, 1-вкл)              |
//|           Alert, Comment, Print, SendMail, SendNotification                |
//|    am - флаг всех повторяющихся сообщений                                  |
//+----------------------------------------------------------------------------+
void Message( string ms, string nv= "01100" , bool am=False) {
   static string prevMessage= "" ;
   string as[];
   int     i, k;

   if (StrToInteger( StringSubstr (nv, 1 , 1 ))== 1 ) Comment (ms);
   if (( StringLen (ms)> 0 ) && (am || prevMessage!=ms)) {
     if (StrToInteger( StringSubstr (nv, 0 , 1 ))== 1 ) {
      k=StrSplit(ms, as, "\n" );
       for (i= 0 ; i<k; i++) Alert (as[i]);
    }
     if (StrToInteger( StringSubstr (nv, 2 , 1 ))== 1 ) {
      k=StrSplit(ms, as, "\n" );
       for (i= 0 ; i<k; i++) Print (as[i]);
    }
     if (StrToInteger( StringSubstr (nv, 3 , 1 ))== 1 ) SendMail (WindowExpertName(), ms);
     if (StrToInteger( StringSubstr (nv, 4 , 1 ))== 1 ) SendNotification(ms);
    prevMessage=ms;
  }
}

not. Ekli, Message() işlevini test etmek için bir komut dosyasıdır.

Dosyalar:
 
KimIV :

Message() işlevinin yeni sürümü.


Message() işlevi, burada yayınlandığı günden bu yana iki kez değişti. İlk değişiklik, Print() işleviyle uzman günlüğüne çıktıyı devre dışı bırakma ve bir dizi özdeş mesajdan yalnızca ilk mesajı görüntüleme yeteneğini ekledi. İkinci değişiklik, çıktı yönergelerini ekledi, yani mevcut Comment() ve Print() işlevlerine ek olarak Alert() , SendMail() ve SendNotification() kullanıldı. Bu gönderdiğim son değişiklik

Message() işlevi, çeşitli yönlerde bir metin mesajı göndermek için tasarlanmıştır. Mevcut ticaret durumunu açıklamak, programın işleyişini kaydetmek, tüccara önemli değişiklikleri zamanında bildirmek vb. için hem hata ayıklama amacıyla hem de hazır geliştirmelerde kullanılabilir. İşlev, üç parametreyi kabul eder: son ikisi isteğe bağlıdır:
  • ms - Dize, çıktısı alınacak metin mesajı, iletilir.
  • nv - Mesajın çıktısının alınması gereken yönü belirten bir bayrak dizisi. Beş bayrak beş aşinalıktır. Her aşinalık sıfırla kapanır ve birer birer belirli bir çıkış yönünü açar. Soldan sağa sırasıyla Alert, Comment, Print, SendMail ve SendNotification'dır. Varsayılan değer "01100"dür, yani Yorum ve Yazdır etkindir, geri kalanı devre dışıdır.
  • am - Boolean, True - tüm mesajları göster, False - bir dizi aynı mesajdan yalnızca ilk mesajı görüntüle. Varsayılan değer False'dır .

Uyarı ve Yazdır çıktı yönergeleri hakkında (bilinlik 1 ve 3), bir mesajı satır satır görüntüleyebileceklerine dikkat edilmelidir. Yani, mesaj metninde bir satır sonu varsa - "\n" kontrol karakteri, o zaman her satır bağımsız olarak görüntülenecektir. Ekteki test senaryosunu deneyin, beğeneceğinizi düşünüyorum :-)


not. Ekli, Message() işlevini test etmek için bir komut dosyasıdır.

OpenPosition işlevinize bir durma düzeyi kontrolü eklediniz mi?
 
sv. :
OpenPosition işlevinize bir durma düzeyi kontrolü eklediniz mi?


hayır... ne tür bir çek demek istiyorsun? Peki dur kalk kontrolden geçemedi diyelim ne yapmalıyım? Seçenekler var:

  1. Açma,
  2. Dur ve al'ı ayarlayın.

 
KimIV :


hayır... ne tür bir çek demek istiyorsun? Peki dur kalk kontrolden geçemedi diyelim ne yapmalıyım? Seçenekler var:

  1. Açma,
  2. Dur ve al'ı ayarlayın.

Öğe 1 ve 2 arasında özel bir anahtar girebilirsiniz. Örneği izleyerek:
 int            modeSetOrders = 1 ;       // Способ установки ордеров:
                                       //  0 - по заданной цене
                                       //  1 - скорректировать цены
                                       //  2 - вход по текущим ценам
 

Test komut dosyasındaki OpenPosition() işlevinin yeni sürümü.

Ne var ne yok?

1. 130 Hatalı duraklar ve NumberOfTry>1 değişkeninin değeri durumunda, fonksiyon StopLoss ve TakeProfit fiyat seviyelerini OP_SELL için Teklif'e ve OP_SATIN AL'a göreli MODE_STOPLEVEL+MODE_SPREAD değerine ayarlamaya çalışacaktır.

Yorum:

Fiyat seviyelerinin düzeltilmesi için, NumberOfTry global değişkeninin değeri 1'den büyük olmalıdır . Bunun nedeni, bir pozisyon açmaya yönelik ilk denemenin 130 hatasını tespit edip fiyat seviyelerini düzeltmesi, ikinci ve sonraki denemelerin ise bir pozisyon açma denemesidir. ayarlanan seviyeler ile pozisyon.

Dosyalar:
 
KimIV, sizi yeni özelliklerle tekrar burada görmekten mutluluk duyuyoruz.
 

Tünaydın.

KimIV'ten faydalı işlevler kitaplığını aşağıdakiler gibi bazı basit işlevlerle desteklemek mümkün müdür:

1.   Bazı kriterlere göre seçilen açılış fiyatı   pozisyon (sembol, tip, parti büyüklüğü, sihirli sayı). Bu fiyat, global değişkenlerde saklanabilir ve oluşturabileceğiniz bir fiyat seviyesi olarak kullanılabilir.   danışman algoritması.

2.   Bazı kriterlere göre seçilen bir bileti döndürür   pozisyonlar   veya siparişler (sembol, tip, parti büyüklüğü, sihirli sayı). Bilet   önemli tanımlayıcı, her yerde ve hatta bir varlık bayrağı olarak kullanılabilir.

Bu kadar basit işlevler ne kadar çok olursa, seçim yapmak o kadar kolay olacaktır.   en çok   Kendiniz için en uygun olanları, mevcut olanları değiştirirken hata yapmayacağınızdan korkmadan.

Özellikleriniz için teşekkür ederiz.

Neden: