코딩 도움말 - 페이지 707

 

친애하는 프로코더 여러분,

내 EA에 "하루에 4번의 거래 / 이익 목표에 도달하면 거래 중지" 기능을 구현하고 싶습니다.

최대 거래 한도/이익에 도달하면 EA는 거래를 계속하기 위해 다음날까지 기다려야 합니다.

누군가 내 코드를 검토할 수 있는지 궁금합니다. 여기에 약간의 "뇌가 정지된" 상태가 있으므로 코드

일종의 의사 코드 상태입니다... ;-)

미리 감사합니다!

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 :

내역(현재 날짜에 마감된 주문)과 열린 주문을 모두 확인하려면 다음과 같이 시도하십시오.

   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;  

안녕 믈라덴

도움을 주셔서 대단히 감사합니다. 이제 이 문제를 처리하는 방법이 더 명확해졌습니다.

"일일 수익 목표"도 확인할 수 있습니까? EA가 50에 가야한다고 가정 해 봅시다.- 하루에 EUR,

일일 목표에 도달하면 거래를 중지하고 다음날 계속됩니다....

아마도 다음과 같습니다.

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 :

안녕 믈라덴

도움을 주셔서 대단히 감사합니다. 이제 이 문제를 처리하는 방법이 더 명확해졌습니다.

"일일 수익 목표"도 확인할 수 있습니까? EA가 50에 가야한다고 가정 해 봅시다.- 하루에 EUR,

일일 목표에 도달하면 거래를 중지하고 다음날 계속됩니다....

아마도 다음과 같습니다.

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

현재 열려 있는 장단기 주문 번호를 확인 하는 루프에 수익 수집(합산)을 추가하지 않겠습니까?

이 같은 :


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

그런 다음 추가 제어를 위해profitSoFarLong 및profitSoFarShort를 사용할 수 있습니다.


추신: 합계를 원할 경우(닫힌 주문과 열린 주문의 경우) 이미 닫힌 주문에도 비슷한 코드를 추가할 수 있습니다.

 

안녕 믈라덴

저를 위해 "AutoFiboAutoTrend" 표시기를 수정했고 잘 작동합니다. fibo의 방향이 "위"에서 "아래"로 바뀔 때 알림과 함께 오디오 경고를 추가할 수 있습니까? Pls는 이미지 1 + 2를 참조하십시오

레아 감사합니다

파일:
Fibo 1.jpg  19 kb
Fibo 2.jpg  45 kb
 
mladen :

현재 열려 있는 장단기 주문 번호를 확인하는 루프에 수익 수집(합산)을 추가하지 않겠습니까?

이 같은 :


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

그런 다음 추가 제어를 위해profitSoFarLong 및profitSoFarShort를 사용할 수 있습니다.


추신: 합계를 원할 경우(닫힌 주문과 열린 주문의 경우) 이미 닫힌 주문에도 비슷한 코드를 추가할 수 있습니다.

안녕 믈라덴

도움을 주셔서 대단히 감사합니다!

다음과 같이 코드를 구현했습니다.

// 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 :
도와주세요 mladen. 첨부된 EA에서 SLIPPAGE가 작동하지 않습니다.

라지브

Slippage는 OrderSend() 호출 에서 올바른 위치에 있습니다. 코드 사용이 정상이므로 더 큰 값을 사용하고 테스트하십시오.

 

도와주세요... 모든 내보내기 수단과 함께 "닫을" 때마다 .csv 파일에 쓸 수 있습니다.
코드에서 이 표시기

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

마우스를 올리지 않고 "닫을" 때마다 .csv 파일에 저장하고 파일을 다시 업데이트하고 싶습니다. .. 매분 한 줄로 파일을 끝내십시오. 예를 들어))))))) PLEASE PLEASE PLEASE. R과의 상호작용을 위한 작업 도구를 주십시오.

 
kostumer27 :

도와주세요... 모든 내보내기 수단과 함께 "닫을" 때마다 .csv 파일에 쓸 수 있습니다.
코드에서 이 표시기

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

마우스를 올리지 않고 "닫을" 때마다 .csv 파일에 저장하고 파일을 다시 업데이트하고 싶습니다. .. 매분 한 줄로 파일을 끝내십시오. 예를 들어))))))) PLEASE PLEASE PLEASE. R과의 상호작용을 위한 작업 도구를 주십시오.

모든 새로운 바를 의미합니까?
 
네. 일정에 있는 것의 기록 + 1개의 막대(& my iCustom 표시기 ). 파일을 영원히 다시 쓰지 않고 물어보십시오.
안정적인 파일 + 각 막대 ))) 모두 =)
 
kostumer27 :
네. 일정에 있는 것의 기록 + 1 막대(& my iCustom 표시기). 파일을 영원히 다시 쓰지 않고 물어보십시오.
안정적인 파일 + 각 막대 ))) 모두 =)

다음은 옵션이 있는 버전입니다. 이전 데이터 파일을 다시 작성해야 하거나 새 막대마다 항상 새 파일을 생성해야 합니다.

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

이는 표시기이며 RewriteOldData 매개변수 를 설정하고 작동하도록 하기만 하면 됩니다.

파일: