Kodlama yardımı - sayfa 707

 

Sevgili kodlayıcılar,

EA'ma "günde dört işlem / Kâr Hedefine ulaşılırsa ticareti durdur" özelliğini uygulamak istiyorum.

Maksimum ticaret limitine / kârına ulaşılırsa, EA ticarete devam etmek için bir sonraki güne kadar beklemelidir.

Acaba birisi kodumu gözden geçirebilir mi, burada biraz "beyin donması" var, bu yüzden kod

bir tür sözde kod durumudur... ;-)

Şimdiden teşekkür ederim!

extern int     MaxShortTrades   = 2 ;
extern int     MaxLongTrades    = 2 ;
extern double profitTarget     = 300; // Target in Money

// Count Trades per Day.

   int y;
   int totalOrders = 4;
   datetime toT; // Time of Trade
   datetime doT; // Day of Trade
   datetime now = TimeCurrent ();
   datetime boD=now-now% 86400 ; // Beginning of day

 

if (AccountProfit()>= profitTarget)

{

 

for (y= 0 ;y<totalOrders; y++)
     {

       if ( OrderSelect (y, SELECT_BY_POS , MODE_HISTORY ))
        {
         toT= OrderOpenTime (); // Time of Trade
         doT=toT-toT% 86400 ; // Day of Trade.
         if (doT==boD)
           { // Time of Trade within Current Day.

             for (j= OrdersTotal ()- 1 ;j>= 0 ; j--)
              {
               if ( OrderType ()== OP_BUY )  totalOrders++;   // Check # of long trades.
               if ( OrderType ()== OP_SELL ) totalOrders++; // Check # of short trades
              }

           }
        }
     }


   if (totalOrders<MaxLongTrades  &&  Indicator_LONG_signal) Order=SIGNAL_BUY;
   if (totalOrders<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
 
mladen :

Hem geçmişi (günümüzde kapanan siparişler için) hem de açılan siparişleri kontrol etmek için şunu deneyin:

   datetime today = StringToTime ( TimeToString ( TimeCurrent (), TIME_DATE ));
   int totalOrdersLong  = 0 , totalOrdersShort = 0 ;  
       for ( int y= OrdersHistoryTotal ()- 1 ;y>= 0 ; y--)
      {
         if ( OrderSelect (y, SELECT_BY_POS , MODE_HISTORY ))
         if ( OrderCloseTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   totalOrdersLong++;
             if ( OrderType ()== OP_SELL )  totalOrdersShort++;
         }        
      }
       for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
      {
         if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
         if ( OrderOpenTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   totalOrdersLong++;
             if ( OrderType ()== OP_SELL )  totalOrdersShort++;
         }        
      }

   if (totalOrdersLong <MaxLongTrades  && Indicator_LONG_signal) Order=SIGNAL_BUY;
   if (totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;  

Merhaba Mladen,

yardımınız için çok teşekkür ederim, şimdi bununla nasıl başa çıkılacağı daha netleşti.

Bir "günlük kar hedefi" olup olmadığını kontrol etmek de mümkün müdür? Diyelim ki EA günde 50.- EUR'ya gitmeli,

günlük hedefe ulaşılırsa, ticareti durdurur ve ertesi gün devam eder....

Muhtemelen şöyle bir şey:

extern double profitTarget= 50 ; // Profit Target in money

if ( AccountProfit ()<= profitTarget)

{
datetime today = StringToTime ( TimeToString ( TimeCurrent (), TIME_DATE ));
   int totalOrdersLong  = 0 , totalOrdersShort = 0 ;  
       for ( int y= OrdersHistoryTotal ()- 1 ;y>= 0 ; y--)
      {
         if ( OrderSelect (y, SELECT_BY_POS , MODE_HISTORY ))
         if ( OrderCloseTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   totalOrdersLong++;
             if ( OrderType ()== OP_SELL )  totalOrdersShort++;
         }        
      }
       for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
      {
         if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
         if ( OrderOpenTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   totalOrdersLong++;
             if ( OrderType ()== OP_SELL )  totalOrdersShort++;
         }        
      }

   if (totalOrdersLong <MaxLongTrades  && Indicator_LONG_signal) Order=SIGNAL_BUY;
   if (totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;  
}

// Check if Profit Targer for the day is reached, so close all open Opsitions

if ( AccountProfit ()>= profitTarget)

{
if ( OrderSelect (buy_ticket, SELECT_BY_TICKET ))
                    {
                     dummyResult= OrderClose ( OrderTicket (), OrderLots (), Bid ,Slippage*PipMultiplier,MediumSeaGreen);
                     Print ( "Error closing Buy #" ,( string ) OrderTicket (), " Error code " ,( string ) GetLastError ());
                    }
                 }
               else

               if (Order==SIGNAL_CLOSESELL && sell_ticket!= 0 )
                 {
                   if ( OrderSelect (sell_ticket, SELECT_BY_TICKET ))
                    {
                     dummyResult= OrderClose ( OrderTicket (), OrderLots (), Ask ,Slippage*PipMultiplier,DarkOrange);
                     Print ( "Error closing Sell #" ,( string ) OrderTicket (), " Error code " ,( string ) GetLastError ());
                    }
}
 
tfi_markets :

Merhaba Mladen,

yardımınız için çok teşekkür ederim, şimdi bununla nasıl başa çıkılacağı daha netleşti.

Bir "günlük kar hedefi" olup olmadığını kontrol etmek de mümkün müdür? Diyelim ki EA günde 50.- EUR'ya gitmeli,

günlük hedefe ulaşılırsa, ticareti durdurur ve ertesi gün devam eder....

Muhtemelen şöyle bir şey:

extern double profitTarget= 50 ; // Profit Target in money

if ( AccountProfit ()<= profitTarget)

{
datetime today = StringToTime ( TimeToString ( TimeCurrent (), TIME_DATE ));
   int totalOrdersLong  = 0 , totalOrdersShort = 0 ;  
       for ( int y= OrdersHistoryTotal ()- 1 ;y>= 0 ; y--)
      {
         if ( OrderSelect (y, SELECT_BY_POS , MODE_HISTORY ))
         if ( OrderCloseTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   totalOrdersLong++;
             if ( OrderType ()== OP_SELL )  totalOrdersShort++;
         }        
      }
       for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
      {
         if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
         if ( OrderOpenTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   totalOrdersLong++;
             if ( OrderType ()== OP_SELL )  totalOrdersShort++;
         }        
      }

   if (totalOrdersLong <MaxLongTrades  && Indicator_LONG_signal) Order=SIGNAL_BUY;
   if (totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;  
}

// Check if Profit Targer for the day is reached, so close all open Opsitions

if ( AccountProfit ()>= profitTarget)

{
if ( OrderSelect (buy_ticket, SELECT_BY_TICKET ))
                    {
                     dummyResult= OrderClose ( OrderTicket (), OrderLots (), Bid ,Slippage*PipMultiplier,MediumSeaGreen);
                     Print ( "Error closing Buy #" ,( string ) OrderTicket (), " Error code " ,( string ) GetLastError ());
                    }
                 }
               else

               if (Order==SIGNAL_CLOSESELL && sell_ticket!= 0 )
                 {
                   if ( OrderSelect (sell_ticket, SELECT_BY_TICKET ))
                    {
                     dummyResult= OrderClose ( OrderTicket (), OrderLots (), Ask ,Slippage*PipMultiplier,DarkOrange);
                     Print ( "Error closing Sell #" ,( string ) OrderTicket (), " Error code " ,( string ) GetLastError ());
                    }
}

Şu anda açık olan uzun ve kısa sipariş numaralarını kontrol eden döngüye neden biraz kar toplama (toplama) eklemiyorsunuz?

Bunun gibi bir şey:


       double profitSoFarLong= 0 ,profitSoFarShort= 0 ;  
       for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
      {
         if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
         if ( OrderOpenTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   { totalOrdersLong++;  profitSoFarLong  += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
             if ( OrderType ()== OP_SELL )  { totalOrdersShort++; profitSoFarShort += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
         }        
      }

Ardından daha fazla kontrol için profitSoFarLong ve profitSoFarShort'u kullanabilirsiniz.


Not: Toplamı almak isterseniz (kapalı ve açık siparişler için), daha önce kapatılmış siparişlere de benzer kod eklemesi yapılabilir)

 

Merhaba Mladen,

"AutoFiboAutoTrend" göstergesini benim için düzelttiniz ve iyi çalışıyor. Fibo yönü "yukarı"dan "aşağı"ya değiştiğinde bildirimli sesli uyarı eklemek mümkün müdür? Lütfen resimlere bakın 1 + 2

teşekkür ederim Lea

Dosyalar:
Fibo 1.jpg  19 kb
Fibo 2.jpg  45 kb
 
mladen :

Şu anda açık olan uzun ve kısa sipariş numaralarını kontrol eden döngüye neden biraz kar toplama (toplama) eklemiyorsunuz?

Bunun gibi bir şey:


       double profitSoFarLong= 0 ,profitSoFarShort= 0 ;  
       for ( int y= OrdersTotal ()- 1 ;y>= 0 ; y--)
      {
         if ( OrderSelect (y, SELECT_BY_POS , MODE_TRADES ))
         if ( OrderOpenTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   { totalOrdersLong++;  profitSoFarLong  += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
             if ( OrderType ()== OP_SELL )  { totalOrdersShort++; profitSoFarShort += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
         }        
      }

Ardından daha fazla kontrol için profitSoFarLong ve profitSoFarShort'u kullanabilirsiniz.


Not: Toplamı almak isterseniz (kapalı ve açık siparişler için), daha önce kapatılmış siparişlere de benzer kod eklemesi yapılabilir)

Merhaba Mladen,

yardımın için çok teşekkür ederim!

Kodu şu şekilde uyguladım:

// Trades per Day and Profit Target

   datetime today = StringToTime ( TimeToString ( TimeCurrent (), TIME_DATE ));
   int totalOrdersLong  = 0 , totalOrdersShort = 0 ;  
   int x;
       for (x= OrdersHistoryTotal ()- 1 ;x>= 0 ; x--)
      {
         if ( OrderSelect (x, SELECT_BY_POS , MODE_HISTORY ))
         if ( OrderCloseTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   totalOrdersLong++;
             if ( OrderType ()== OP_SELL )  totalOrdersShort++;
         }        
      }
       for (x= OrdersTotal ()- 1 ;x>= 0 ; x--)
      {
         if ( OrderSelect (x, SELECT_BY_POS , MODE_TRADES ))
         if ( OrderOpenTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   totalOrdersLong++;
             if ( OrderType ()== OP_SELL )  totalOrdersShort++;
         }            
      
      }
      
   double profitSoFarLong= 0 ,profitSoFarShort= 0 ;  
       for (x= OrdersTotal ()- 1 ;x>= 0 ; x--)
      {
         if ( OrderSelect (x, SELECT_BY_POS , MODE_TRADES ))
         if ( OrderOpenTime ()>=today)
         {
             if ( OrderType ()== OP_BUY )   { totalOrdersLong++;  profitSoFarLong  += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
             if ( OrderType ()== OP_SELL )  { totalOrdersShort++; profitSoFarShort += OrderProfit ()+ OrderCommission ()+ OrderSwap (); }
         }        
      }
  
// EA STOP if Profit is Reached.

if (profitSoFarLong> 50 || profitSoFarLong> 50 )
{
             if ( OrderType ()== OP_BUY )  { dummyResult = OrderClose ( OrderTicket (), OrderLots (), MarketInfo (s_symbol, MODE_ASK ), 0 ,CLR_NONE); }
             if ( OrderType ()== OP_SELL ) { dummyResult = OrderClose ( OrderTicket (), OrderLots (), MarketInfo (s_symbol, MODE_BID ), 0 ,CLR_NONE); }

       Print ( "Account Profit Reached. All Open Trades Have Been Closed" );
       return ( 0 );
  
   Sleep ( 3600 ); // one hour

}
 
Rajiv :
lütfen bana yardım et mladen. SLIPPAGE ekli EA'da çalışmıyor

Rajiv

Slippage, OrderSend() çağrılarında doğru yerdedir - daha büyük bir değer kullanmayı deneyin ve kod kullanımı uygun olduğundan test edin

 

Lütfen bana yardım edin... Tüm dışa aktarma yöntemleriyle her "Kapat" .csv dosyasına yazmak mümkündür.
kodda bu gösterge

void RSI_output(string SymbolName,int PeriodMinutes)

{

   int size=iBars(SymbolName,PeriodMinutes);                                      if(size==0)  return;

   int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV);  if (handle<0)return;


   FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");

   for (int i=size-1;i>=0;i--)

      {

        FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))

,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)

,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));

      }

   FileClose(handle);      

   return;

}

int start() { RSI_output(_Symbol,_Period); return(0); }

Her "kapanışta", üzerine gelmeden ve güncelleme dosyasını yeniden .csv dosyasına kaydetmek istiyorum. Sadece bir satırda bir dosyayı bitirmek .. her dakika, örneğin)))))))) LÜTFEN LÜTFEN LÜTFEN. Bana R ile etkileşim için çalışan bir araç ver.

 
kostumer27 :

Lütfen bana yardım edin... Tüm dışa aktarma araçlarıyla her "Kapat" .csv dosyasına yazmak mümkündür.
kodda bu gösterge

void RSI_output(string SymbolName,int PeriodMinutes)

{

   int size=iBars(SymbolName,PeriodMinutes);                                      if(size==0)  return;

   int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV);  if (handle<0)return;


   FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");

   for (int i=size-1;i>=0;i--)

      {

        FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))

,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)

,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));

      }

   FileClose(handle);      

   return;

}

int start() { RSI_output(_Symbol,_Period); return(0); }

Her "kapanışta", üzerine gelmeden ve güncelleme dosyasını yeniden .csv dosyasına kaydetmek istiyorum. Sadece bir satırda bir dosyayı bitirmek .. her dakika, örneğin)))))))) LÜTFEN LÜTFEN LÜTFEN. Bana R ile etkileşim için çalışan bir araç ver.

Her yeni barda mı demek istiyorsun?
 
Evet. programdakilerin geçmişi + 1 bar (& iCustom göstergelerim ). sadece dosyayı sonsuza kadar yeniden yazmadan sorun.
Kararlı dosya + her çubuk)))) Hepsi =)
 
kostumer27 :
Evet. programdakilerin geçmişi + 1 bar (& iCustom göstergelerim). sadece dosyayı sonsuza kadar yeniden yazmadan sorun.
Kararlı dosya + her çubuk)))) Hepsi =)

İşte seçeneği olan bir sürüm - eski veri dosyasını yeniden yazmalı mı yoksa her yeni çubuk için her zaman yeni bir dosya oluşturmalı mı?

#property indicator_chart_window
#property indicator_buffers 0

extern bool RewriteOldData= true ;
void RSI_output( string symbolName, int PeriodMinutes, datetime time)
{
   string name = (RewriteOldData) ? symbolName+PeriodMinutes : symbolName+PeriodMinutes+( string )(time/ 60 );
   int size  = iBars (symbolName,PeriodMinutes);                 if (size== 0 )   return ;
   int handle= FileOpen (name+ "_RSI.csv" , FILE_WRITE | FILE_CSV );   if (handle< 0 ) return ;


   FileWrite (handle, "Time seconds;Time;Open;Low;High;Close;Volume;RSI" );
   for ( int i=size- 1 ;i>= 0 ;i--)
         FileWrite (handle, iTime (symbolName,PeriodMinutes,i), TimeToStr ( iTime (symbolName,PeriodMinutes,i))
               , iOpen (symbolName,PeriodMinutes,i), iLow (symbolName,PeriodMinutes,i), iHigh (symbolName,PeriodMinutes,i)
               , iClose (symbolName,PeriodMinutes,i), iVolume (symbolName,PeriodMinutes,i), iCustom (symbolName,PeriodMinutes, "RSI" , 0 ,i));
   FileFlush (handle);              
   FileClose (handle);      
   return ;

}
int start()
{
   static datetime lastTime= 0 ;
               if (lastTime!= Time [ 0 ])  RSI_output( _Symbol , _Period , Time [ 0 ]);
                   lastTime= Time [ 0 ];
   return ( 0 );
}

Bu bir göstergedir ve tüm yapmanız gereken RewriteOldData parametresini ayarlamak ve çalışmasına izin vermektir.

Dosyalar: