Çift yönlü işlem açarken sorun yaşıyorum yardım

 

Arkadaşlar merhabalar daha önce her düşüşte işlem açan bir expert üzerinde çalıştığımı forumda bildirmiştim. şimdi uzmanı geliştirmek istiyorum. ve her düşüş veya yükselişte hem buy hem de sell yönlü işlem açmasını istiyorum ancak fonksiyon içerisine buy komutunun altına sell komutu da verdiğimde çalışıyor ancak daha önce işlem açtığı bölgelerde işlem açmıyor sebebi ne olabilir? Kodlar aşağıdaki gibidi;



//include the trade Library
#include <Trade\Trade.mqh>
CTrade Trade;

input int                              ilk_islem_TP             =  300;     // İlk işlemin Tp Noktası
input int                              Dusus_islemi_TP       =  300;     //Diğer işlemlerin Tp noktası
input int                              Dusus_Orani             =  100;     //Kademeli Düşüş Puanı
input double                        Baslangic_Lot           = 0.01;   //Lot Miktarı
 
void OnTick()
{
//-------------------------------------------------------------------------------
//Expertin Ana Kodu
//---------------------------------------------------------------------------   
   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   //if we have no open position or order      
   int toplam_AcikPozisyonlar = GetTotalOpenPositions();
   if(toplam_AcikPozisyonlar == 0)
   {
      Trade.Buy(Baslangic_Lot,_Symbol,Ask,0,Ask + (ilk_islem_TP * _Point),NULL);
      Trade.Sell(Baslangic_Lot,_Symbol,Bid,0,Bid - (ilk_islem_TP * _Point),NULL);

   }
   else 
   {
      //find latest position
      ulong latest_ticket = GetLatestTicketNumber();
      
      if(PositionSelectByTicket(latest_ticket) == true)
      {
         double Pozisyonun_Acilis_Fiyati = PositionGetDouble(POSITION_PRICE_OPEN);
         
         if(Ask < (Pozisyonun_Acilis_Fiyati - (Dusus_Orani*_Point))) 
         {

            Trade.Buy(Baslangic_Lot,_Symbol,Ask,0,Ask + (Dusus_islemi_TP * _Point),NULL);
            Trade.Sell(Baslangic_Lot,_Symbol,Bid,0,Bid - (ilk_islem_TP * _Point),NULL);

         }
         
      }
   }
   
}

//+------------------------------------------------------------------+
//| Get Open Positions total function                                  |
//+------------------------------------------------------------------+
int GetTotalOpenPositions()
{
   int totalActiveOrders = 0;
   
   for(int i=PositionsTotal()-1; i>=0; i--) 
   {
      ulong ticketNumber = 0;
      
      if(PositionGetSymbol(i) == Symbol())
      {
         ticketNumber = PositionGetTicket(i); 
         if(ticketNumber == 0)
         {
            Print("Pozisyon var ama seçilmedi. Hata: ", GetLastError());  
            ResetLastError();
            continue;
         }
         else
         {
            totalActiveOrders++;
         }         
      }     
   }
   return totalActiveOrders;
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Get Current Profit / Loss function                               |
//+------------------------------------------------------------------+
double GetCurrentProfitLoss()
{
   double totalprofitLoss = 0;
   
   for(int i=PositionsTotal()-1; i>=0; i--) 
   {
      ulong ticketNumber = 0;
      
      if(PositionGetSymbol(i) == Symbol())
      {
         ticketNumber = PositionGetTicket(i); 
         if(ticketNumber == 0)
         {
            Print("Pozisyon var ama seçilmedi. Hata: ", GetLastError());  
            ResetLastError();
            continue;
         }
         else
         {
            totalprofitLoss = totalprofitLoss + PositionGetDouble(POSITION_PROFIT);
         }
      }
   }
   
   return totalprofitLoss;
}

//+------------------------------------------------------------------+
//| Get Latest Position ticket number function                       |
//+------------------------------------------------------------------+
ulong GetLatestTicketNumber()
{
   ulong LatestTicket = 0;
   long latestPositionTime = 0;
   
   for(int i=PositionsTotal()-1; i>=0; i--) 
   {
      ulong ticketNumber = 0;
      
      
      if(PositionGetSymbol(i) == Symbol())
      {
         ticketNumber = PositionGetTicket(i); 
         if(ticketNumber == 0)
         {
            Print("Pozisyon var ama seçilmedi. Hata: ", GetLastError());  
            ResetLastError();
            continue;
         } 
         else
         {
            if(PositionGetInteger(POSITION_TIME) > latestPositionTime)
            {
               LatestTicket = ticketNumber;
               latestPositionTime = PositionGetInteger(POSITION_TIME);               
            }
             
         }    
      }
   }
   
   return LatestTicket;
}



Yardımcı olursanız sevinirim.

 
Yasar Sari:

Arkadaşlar merhabalar daha önce her düşüşte işlem açan bir expert üzerinde çalıştığımı forumda bildirmiştim. şimdi uzmanı geliştirmek istiyorum. ve her düşüş veya yükselişte hem buy hem de sell yönlü işlem açmasını istiyorum ancak fonksiyon içerisine buy komutunun altına sell komutu da verdiğimde çalışıyor ancak daha önce işlem açtığı bölgelerde işlem açmıyor sebebi ne olabilir? Kodlar aşağıdaki gibidi;





Yardımcı olursanız sevinirim.

   //if we have no open position or order      
   int toplam_AcikPozisyonlar = GetTotalOpenPositions();
   if(toplam_AcikPozisyonlar == 0)
   {
      Trade.Buy(Baslangic_Lot,_Symbol,Ask,0,Ask + (ilk_islem_TP * _Point),NULL);
      Trade.Sell(Baslangic_Lot,_Symbol,Bid,0,Bid - (ilk_islem_TP * _Point),NULL);

   }
   else 
   {
      //find latest position
      ulong latest_ticket = GetLatestTicketNumber();
      
      if(PositionSelectByTicket(latest_ticket) == true)
      {
         double Pozisyonun_Acilis_Fiyati = PositionGetDouble(POSITION_PRICE_OPEN);
         
         if(Ask < (Pozisyonun_Acilis_Fiyati - (Dusus_Orani*_Point))) 
         {

            Trade.Buy(Baslangic_Lot,_Symbol,Ask,0,Ask + (Dusus_islemi_TP * _Point),NULL);
            Trade.Sell(Baslangic_Lot,_Symbol,Bid,0,Bid - (ilk_islem_TP * _Point),NULL);

         }
         
      }
   }

bu bölüme göre ilk işlemleri eğer mevcutta bir pozisyon yoksa rastgele bir fiyattan açacak ve sonraki işlemleri ise sadece Alış fiyatı son açılan pozisyonun açılış fiyatından düşüş oranı kadar aşağıda ise yeni emirleri açacak.

 Algoritmanızın yapmasını istediğiniz şey bu mudur?

 
Ahmet Metin Yilmaz #:

bu bölüme göre ilk işlemleri eğer mevcutta bir pozisyon yoksa rastgele bir fiyattan açacak ve sonraki işlemleri ise sadece Alış fiyatı son açılan pozisyonun açılış fiyatından düşüş oranı kadar aşağıda ise yeni emirleri açacak.

 Algoritmanızın yapmasını istediğiniz şey bu mudur?

Kesinlikle bu şekilde hocam. 

Sadece buy pozisyonu olarak yaptığımda sorunsuz çalışıyor ancak çift yönlü ( Aynı anda hem sell hem buy) işlemi açtırmaya çalıştığımda daha önceki işlem bölgelerinde çalışmıyor.
 
Yasar Sari #:

Kesinlikle bu şekilde hocam. 

Sadece buy pozisyonu olarak yaptığımda sorunsuz çalışıyor ancak çift yönlü ( Aynı anda hem sell hem buy) işlemi açtırmaya çalıştığımda daha önceki işlem bölgelerinde çalışmıyor.

Son işlem açılış fiyatı muhtemelen sell işlemine ait fiyat olarak kayda geçtiği için bu sell işlem açılış fiyatının , düşüş oranı olarak belirlediğiniz kadar altına alış fiyatı gelmeden tekrar işlem açmaması normaldir zaten.

 
Ahmet Metin Yilmaz #:

Son işlem açılış fiyatı muhtemelen sell işlemine ait fiyat olarak kayda geçtiği için bu sell işlem açılış fiyatının , düşüş oranı olarak belirlediğiniz kadar altına alış fiyatı gelmeden tekrar işlem açmaması normaldir zaten.

Anladım sanırım hocam. Sell ve buy işlemine ayrı şekilde mi komut vermem lazım. Yani buy ve sell işlemine önceki açılış fiyatına göre ayrı ayrı mı tanımlamam lazım. Sizin düzenleme şansınız var mı ? 

 
Yasar Sari #:

Anladım sanırım hocam. Sell ve buy işlemine ayrı şekilde mi komut vermem lazım. Yani buy ve sell işlemine önceki açılış fiyatına göre ayrı ayrı mı tanımlamam lazım. Sizin düzenleme şansınız var mı ? 

Bence ticket number(s) ile çalışmak çok sağlıklı olmuyor öncelikle ;

bu kapsamda 

1. MagicMumber tanımlayarak açık pozisyon kontrolünü magic number a göre kontrol etmeniz ve son açılmış pozisyonun açılış fiyatını da yine ticket number yerine magic numbera göre kontrol ettirmeniz gerekiyor.

2. Bu haliyle algoritma sadece fiyatlar düşmeye devam ederse işlem açmaya devam edecek gibi duruyor. Peki fiyatlar yükselirse ne olacak? ilk açılan işlemlerdeki buy pozisyonu tp olacak sell pozisyonu duruyor olacak ve bir daha fiyatlar bu açık olan sell pozisyonu açılış fiyatının altına inmediği sürece başka hiçbir pozisyon açılmayacak anlamına geliyor.

3. buy ve sell işlemine göre ayrı algoritma tanımı yapmanız gerek. Bunun için de açık pozisyon var mı kontrollerini de açık buy işlemi var mı ve açık sell işlemi var mı gibi ikiye ayırmanız gerek...vs.

4. Ben sadece neyi nasıl yapmanız gerektiği konusunda yardımcı olabilirim, aksi takdirde siz algoritmanızı nasıl geliştireceğinizi asla tam olarak öğrenemeyeceksiniz.

 
Ahmet Metin Yilmaz #:

Bence ticket number(s) ile çalışmak çok sağlıklı olmuyor öncelikle ;

bu kapsamda 

1. MagicMumber tanımlayarak açık pozisyon kontrolünü magic number a göre kontrol etmeniz ve son açılmış pozisyonun açılış fiyatını da yine ticket number yerine magic numbera göre kontrol ettirmeniz gerekiyor.

2. Bu haliyle algoritma sadece fiyatlar düşmeye devam ederse işlem açmaya devam edecek gibi duruyor. Peki fiyatlar yükselirse ne olacak? ilk açılan işlemlerdeki buy pozisyonu tp olacak sell pozisyonu duruyor olacak ve bir daha fiyatlar bu açık olan sell pozisyonu açılış fiyatının altına inmediği sürece başka hiçbir pozisyon açılmayacak anlamına geliyor.

3. buy ve sell işlemine göre ayrı algoritma tanımı yapmanız gerek. Bunun için de açık pozisyon var mı kontrollerini de açık buy işlemi var mı ve açık sell işlemi var mı gibi ikiye ayırmanız gerek...vs.

4. Ben sadece neyi nasıl yapmanız gerektiği konusunda yardımcı olabilirim, aksi takdirde siz algoritmanızı nasıl geliştireceğinizi asla tam olarak öğrenemeyeceksiniz.

Tamam hocam çok teşekkür ederim anlatımınıza göre düzenleme yapacağım. Sorun yaşadığım yerde yine kodları burada paylaşırım.

Neden: