Her düşüşte işlem nasıl açılır? - sayfa 2

 
Yaşar Sarı #:

 Ancak her düşüşte tek bir işlem açmak için PositionsTotal(0) eklemem mi gerekiyor?

Hesap ve risk kontrolü için elimde daha önceden kodlar vardı kaybettim şuan da aklıma da gelmiyor açıkçası. Expert sadece Nasdaq'da  işlem yapacak onun için 50 puan diyordum.

PositionsTotal()

o anda açılmış pozisyonların sayısını  verir  0 ise hiç işlem açılmadığı yani yeni bir buy veya sel işlemi açabilirsin. işlem   gerçekleştiğinde bu sayı artar ve 

belirlediğin limit sonrasında  yeni pozisyon açmayı durudurursun ben 3 le sınırlama yapmışım 

ancak bu  pozisyon sayısı dır emir sayısı değil emir sayısını  

OrdersTotal()

ile takip ediyorsun bunuda BuyLimit icra ederken kontrol edebilirsin fazla emir girmeyi önleyebilirsin. 

her koşul gerçekleştiğinde  icra ettiğin fonksiyon piyasa emri ise işlem gerçekleşir ise pozisyon artar limit emri ise emir sayısı artar  limit  daha sonra pozisyona dönüşebilir  de dönüşmeyebilirde 

 senin yapmak istediğin şey sanırım  tek seferde emirleri bir defada yazayım 

ozaman bunun için Ontick() e gerek yok,  OnInit() de yapılır. Ontick() de Limit emir vermek  karmaşık bir olay  saniyede 1000 kere tick atabilyor piyasa  ve limit emirlerde gerek yok buna emiri birkere vereceksin sürekli duracak ama bekleyen emiri  iptal etmek istersen ontickte kontrol edebilirsin

bunlar adım adım ilerlemen gereken konular

 
#include <Trade/Trade.mqh>
CTrade islem;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double referans_fiyat, fark_fiyat;
uint  izin_verilen_islem_adedi = 3;
double volume = 0.01;
void OnInit()
  {
   referans_fiyat = iOpen(NULL, PERIOD_D1, 0);
   if(OrdersTotal() == 0)
     {
       islem.BuyLimit(volume,referans_fiyat-50/Point(),NULL,0,0,ORDER_TIME_DAY,0)
       islem.BuyLimit(volume,referans_fiyat-100/Point(),NULL,0,0,ORDER_TIME_DAY,0)
       islem.BuyLimit(volume,referans_fiyat-150/Point(),NULL,0,0,ORDER_TIME_DAY,0)
       islem.BuyLimit(volume,referans_fiyat-200/Point(),NULL,0,0,ORDER_TIME_DAY,0)  
     }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   void OnTick()
     {
      // boş kalacak
     }

bu kodlar bir seferde gün açılış fiyatının  50 puanlık düşüşlerde almasını istediğin emirleri tek seferde yollar  tekrar tekrar çalıştırman durumunu önlemek için verilmiş emir sayısı sıfır da başlamalı bu kodların ontickte çalışması gerekmiyor Ontick bölümünü iz süren stop ve piyasa koşullarını analiz etmek için kullanıyoruz benelde anlık emir için limit emir için de kullanılabilir ama  limit emir sonsuz kere vermeyi önlemen koşulu çok daraltman ve verilen emir sayısını takip etmen gerekir

 
Mustafa Damgaci #:

bu kodlar bir seferde gün açılış fiyatının  50 puanlık düşüşlerde almasını istediğin emirleri tek seferde yollar  tekrar tekrar çalıştırman durumunu önlemek için verilmiş emir sayısı sıfır da başlamalı bu kodların ontickte çalışması gerekmiyor Ontick bölümünü iz süren stop ve piyasa koşullarını analiz etmek için kullanıyoruz benelde anlık emir için limit emir için de kullanılabilir ama  limit emir sonsuz kere vermeyi önlemen koşulu çok daraltman ve verilen emir sayısını takip etmen gerekir

Hocam öncelikle teşekkür ederim. Demek istediğinizi anladım ancak kodları çalıştıramadım. Üzerinde düzenleme yaptım yine olmadı. Günlük açılış fiyatından -50 şeklinde limit emir verirsen olur demek istediniz, çok mantıklı ancak olmadı işlem açılmıyor test modunda deneme yaparken. Yeni bir strateji denedim aslında daha güzel ancak yine çözemediğim bir sorunla karşılaştım. Yardımcı olabilirseniz gerçekten çok memnun olurum. Sorunu anlatayım;

Bir emir ile BUY işlemine ek birkaç bekleyen emirde BuyLimit ekledim. BUY işlemi TP olmaz aşağı yönlü giderse bekleyen emirler çalışıyor. TP veya SL olursa bekleyen emirler silinsin yerine yeni seviyeden bekleyen emirler eklensin istiyorum. Ancak ilk BUY işleminde veya sonrasında açılan BUY işlemine ek bekleyen BuyLimit emirlerinin iptal olmasını sağlayamadım hiçbir şekilde, sürekli onlara ek yeni seviyeden yüzlerce emir oluyor, BUY işlemi sonlandığında ona bağlı açılan bekleyen emirleri nasıl iptal edebilirim diye sormak istiyorum? Yardımcı olursanız çok sevinirim.

if(PositionsTotal() <= 0)
           {
            islem.Buy(1,_Symbol,ask,bid-75,ask+30,NULL)
            islem.BuyLimit(1,bid-30,_Symbol,0,ask+0,ORDER_TIME_GTC,0,"BUY Limit");
            islem.BuyLimit(1,bid-60,_Symbol,0,ask-15,ORDER_TIME_GTC,0,"BUY Limit");
            islem.BuyLimit(1,bid-90,_Symbol,0,ask-45,ORDER_TIME_GTC,0,"BUY Limit");
            islem.BuyLimit(1,bid-120,_Symbol,0,ask-75,ORDER_TIME_GTC,0,"BUY Limit");
            islem.BuyLimit(1,bid-150,_Symbol,0,ask-105,ORDER_TIME_GTC,0,"BUY Limit");
            islem.BuyLimit(1,bid-180,_Symbol,0,ask-135,ORDER_TIME_GTC,0,"BUY Limit");
            islem.BuyLimit(1,bid-210,_Symbol,0,ask-175,ORDER_TIME_GTC,0,"BUY Limit");

           }


 

ben forum üstünden yazdım kodları metaeditörde yazayım  çalışma hataları olabilir denemedim bakacağım

----

çalışıyor denedim

2022.12.11 00:41:44.284 nasdaq (NAS100,H1) CTrade::OrderSend: buy limit 0.10 NAS100 at 11130.7 [market closed]

2022.12.11 00:41:44.441 nasdaq (NAS100,H1) CTrade::OrderSend: buy limit 0.10 NAS100 at 10630.7 [market closed]

2022.12.11 00:41:44.672 nasdaq (NAS100,H1) CTrade::OrderSend: buy limit 0.10 NAS100 at 10130.7 [market closed]

2022.12.11 00:41:44.832 nasdaq (NAS100,H1) CTrade::OrderSend: buy limit 0.10 NAS100 at 9630.7 [market closed]


#include <Trade/Trade.mqh>
#include <Trade/SymbolInfo.mqh>
CTrade islem;
CSymbolInfo sembol;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double referans_fiyat, fark_fiyat;
uint  izin_verilen_islem_adedi = 3;
double vol  ;
void OnInit()
  {
  // Sembolü Tanımla 
   if(!sembol.Name(NULL))
      return;      
  // Sembolün paramatrelerini al      
   if(!sembol.Refresh())
      return;
  // Tick değerleri al    
   if(!sembol.RefreshRates())
      return;
  // en küçük alınabilecek lot      
   vol =sembol.LotsMin();   
   
   referans_fiyat = iOpen(NULL, PERIOD_D1, 0);
   if(OrdersTotal() == 0)
     {
       islem.BuyLimit(vol,referans_fiyat-50/Point(),NULL,0,0,ORDER_TIME_DAY,0);
       islem.BuyLimit(vol,referans_fiyat-100/Point(),NULL,0,0,ORDER_TIME_DAY,0);
       islem.BuyLimit(vol,referans_fiyat-150/Point(),NULL,0,0,ORDER_TIME_DAY,0);
       islem.BuyLimit(vol,referans_fiyat-200/Point(),NULL,0,0,ORDER_TIME_DAY,0);  
     }
}

ben genelde point çalışıyorum pip çalışırken fiyatlarda buna dikkat etmen lazım nasdaqla daha önce çalışmadım 50 düşmekten kastin pip mi point mi bilemiyorum bazıları % çalışyor

 
Yaşar Sarı #:

Bir emir ile BUY işlemine ek birkaç bekleyen emirde BuyLimit ekledim. BUY işlemi TP olmaz aşağı yönlü giderse bekleyen emirler çalışıyor. TP veya SL olursa bekleyen emirler silinsin yerine yeni seviyeden bekleyen emirler eklensin istiyorum. Ancak ilk BUY işleminde veya sonrasında açılan BUY işlemine ek bekleyen BuyLimit emirlerinin iptal olmasını sağlayamadım hiçbir şekilde, sürekli onlara ek yeni seviyeden yüzlerce emir oluyor, BUY işlemi sonlandığında ona bağlı açılan bekleyen emirleri nasıl iptal edebilirim diye sormak istiyorum? Yardımcı olursanız çok sevinirim.

senin kodlara bakalım bu kodlar Oninit de çalışıyor olmalı 

if(PositionsTotal() <= 0)

   bu kod zaten sıfırdan küçük olamaz 


if(PositionsTotal() < 5 )
// örneğin 5 sözleşme ( açılmış  emir varsa )

if(PositionsTotal() == 0 )
// hiç sözleşme yoksa 

// ben   hiç emir verilmemiş ise hepsini tek seferde ver demişim
if(OrdersTotal() == 0 )

// seninki ise böyle 
if(PositionsTotal() <= 0 )
// zaten sıfırdan  küçük olamaz buy ile 1 artar 
// buylimitle artan OrdersTotal() dir seninkin çalışması zaten mümkün olmaz bunun üzerinde çalış o satır yanlış 
// hem limit hemde anlık emir verirken ikisinide takip etmen gerekir sanırım istediğin



if(OrdersTotal() == 0 )
// ile çözülür
 

açık  işlemi kapatmak için islem.PositionClose kullanmalısın bekleyen emirlerden vazgeçiyorsan veya bu limt emir gelmez fiyatı değiştireyim dersen OrderModify vazgeçtim bu  limit emirden dersen  OrderDelete

bunlar için açılmış limit emirlerin biletlerini saklamış ve biliyor olman lazım o biletleri kapatman gerekir 

budurumda  CPositionInfo ve COrderInfo sınıflarını da kullanmalısın o anda açılmış pozisyon lar stop olmuş tp olmuş her seferinde pozların 

izlemen biletleri örenmen gerekiyor piyasa koşullarına göre hep değişiyor limitli emir pozisyona dönmüş olabilir  bu yüzden bu  konutlar  Ontick() de icar edilir. 

birde hesabın hedgin hesap ise açtığnı kapatman gerekebiliyor bu sınıflarıda öğren 


burada çok önemli bir konu daha var sen limit emirde stop ve tp leride girmişsin 

düştükçe al çıktıkça sat mantığı galiba bu sistemler de marjin kontolünü  çok iyi yapmalısın 

bence bu işler çok karışık zararla sonuçlanacak işler tek bir emiri yönet on tickle an an karar ver

sistem zararını  geri kurtaramaz yani burada 4 emire kadar düşüpte sonra tekrar yükselip 1. emire kadar yükselip hepsi tp olur  fikri hayal gibi birşey 

düştükçe önceki emirlerde stop oluyor  o esnada hesaptaki parada azalıyor açılan pozisyon stop oluyor ve hiç pzosiyon açılmadan yukarı çıkıyor

e neolur şimdi para kazanmamış zarar etmiş olursun  dönüşte açılmış pozisyonu yakalayamıyorsun :) programcılığı biraz daha ilerlet burada önemli olan strateji

ha hesapta çok para var düştükçe alsın çıkınca tp olsun dersen ozaman stop kontrolü karışır ilk açtığın stopun en allta kalması lazım birşeye iyi karar vermen lazım dibi mi yakalıyor bu emirler

ortalamayımı aşağı çekiyor  ben bu her iki fikirdede kazanan görmedim hayatımda. gariptir ilk başlayanlar bu stratejiyi benimsiyor,   eninde sonunda batış bu strateji herçekten kazanan

bir sistem yıllar sürüyor buna hazırlıklı ol