MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1655

 
Volodymyr Zubov # :

여기서 손가락은 OrderSend를 밀어 넣는 것만으로는 가치가 없으며 가능한 한 많이 귀찮게하지 않을 것입니다. 적절하게 사면과 슈카티를 받으십시오.

Volodya, 질문은 달랐습니다.

 
MakarFX # :

Volodya, 질문은 달랐습니다.

무엇에?

 
Volodymyr Zubov # :

무엇에?

도브라니히)
 
MakarFX # :
도브라니히)

토비 테즈.

 
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (CheckForOpen()== 0 )
     {
       if ( OrderSend ( Symbol (),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss* Point ,Ask+TakeProfit* Point , "" ,MagicNumber, 0 ,Blue)) Print ( "BUY OK" );
     }
   if (CheckForOpen()== 1 )
     {
       if ( OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red)) Print ( "SELL OK" );
     }
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int     res=- 1 , buy= 0 , sell= 0 ;
   // Считывание параметров индикаторов 3 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 3 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 3 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 3 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 3 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 2 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 2 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 2 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 2 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 2 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 1 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 1 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 1 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 1 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 1 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 0 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 0 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   
   if (buy == 4 ) res= 0 ;
   if (sell== 4 ) res= 1 ;
   return (res);
  }

모든 조건이 충족되면 각 새 양초에서 주문이 열리지 않도록 만드는 방법을 알려주십시오. 방금 이 코드를 삽입했는데 실제로 4개의 확인 초를 기다리기 시작했지만 1번 주문을 연 후(모든 조건이 충족되었을 때) 다음 모든 초에 대해 주문을 열기 시작했습니다. 조건이 저장되면 이것은 테스터에서 어떻게 보이는지.

+ 만일을 위해 원본 코드를 모두 붙여넣겠습니다. 그렇지 않으면 갑자기 중요한 것을 놓쳤습니다.

 #define MagicNumber   122122
extern string s1             = "Trading options" ;
extern double Lot            = 0.01 ;     // размер лота 0 - авт.расчет
extern double StopLoss       = 40 ;     // стоплосс
extern double TakeProfit     = 10 ;     // тейкпрофит
extern double TrailStop      = 21 ;     // уровень без убытка
extern int     Trailing       = 0 ;       // трейлинг стоп 1 вкл. 0 выкл.
extern int     Breakeven      = 0 ;       // перенос стоп лосса в без убыток
extern string s2             = "Day & Hour" ;
extern int     HrStart        = 0 ;       // время начала торговли
extern int     HrEnd          = 23 ;     // время окончания торговли
extern int     Monday         = 1 ;       // Понедельник 1 вкд. 0 выкл.
extern int     Tuesday        = 1 ;       // Вторник
extern int     Wednesday      = 1 ;       // Среда
extern int     Thursday       = 1 ;       // Четверг
extern int     Friday         = 1 ;       // Пятница
//+------------------------------------------------------------------+
// параметры индикаторов
double MovingPeriodLw        = 5 ;      
double MovingPeriodS1        = 75 ;
double MovingPeriodS2        = 85 ;
double StopLevel;
double TrailStep             = 3 ;       // шаг трейлинг стопа
bool OrderBuy = false , OrderSell = false , Order = false , Init = true ;
int timeprev = 0 , Slip = 3.0 ;

//+------------------------------------------------------------------+
//| Init function                                                    |
//+------------------------------------------------------------------+
void OnInit ()
{
   if ( Digits == 3 || Digits == 5 ) { // Пересчет для 5-ти знаков                                                    
      TakeProfit *= 10 ;
      TrailStop *= 10 ;
      TrailStep *= 10 ;
      StopLoss *= 10 ;
      Slip *= 10 ;
   } 
   return ; 
}
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
{
   StopLevel = MarketInfo( Symbol (), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if (timeprev == Time[ 0 ]) return ;
   timeprev = Time[ 0 ];
   
   // Открытие ордера по методу Пуриа
   CheckForOpen();
}
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() // Открытие ордера по методу Пуриа
{
   double malw,mas1,mas2,macd;
   int     res;  
   // Считывание параметров индикаторов
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 0 );
  
   // Проверяем положение мувмнгов
   if (malw>mas1 && malw>mas2  && OrderSell)
     {
     OrderBuy= true ;
     OrderSell= false ;
     Order= true ;
     }
   
   if (malw<mas1 && malw<mas2  && OrderBuy)
     {
     OrderBuy= false ;
     OrderSell= true ;
     Order= true ;
     }

   // Открываем ордер Buy
   if (macd> 0 && OrderBuy && Order)
     {
     res= OrderSend ( Symbol (),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss* Point ,Ask+TakeProfit* Point , "" ,MagicNumber, 0 ,Blue);
     Order= false ;
     return ;
     }     
   // Открываем ордер Sell   
   if (macd< 0 && OrderSell && Order)
     {
     res= OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red);
     Order= false ;
     return ;
     }
 
}  
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()   // Расчет объема лота
{
   double Lots;
   if (Lot > 0 ) return (Lot);
   Lots=AccountFreeMargin()/ 5000 ;
   Lots= MathMin ( 15 , MathMax ( 0.01 ,Lots));
   if (Lots< 0.1 ) Lots= NormalizeDouble (Lots, 2 );
   else 
     {
     if (Lots< 1 ) Lots= NormalizeDouble (Lots, 1 );
     else        Lots= NormalizeDouble (Lots, 0 );
     }
   return (Lots);
}
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()   // Опредеоение начального пересечения мувингов
{
   double malw,mas1,mas2;
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );

   if ((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
     Init= false ;
     OrderBuy= true ;
     OrderSell= true ;
     }   
   return ;
}
 
//+------------------------------------------------------------------+
// Treylingstop function                                             |
//+------------------------------------------------------------------+
   // Трейлинг стоп
void RealTrailOrder( double trstop, double trstep, double stlevel, int magic) 
{
   double openprice;
   double openstoploss;
   double calculatestoploss;
   double trailstop = MathMax (trstop, stlevel);
   for ( int cmt = OrdersTotal () - 1 ; cmt >= 0 ; cmt--) 
     {
     if ( OrderSelect (cmt, SELECT_BY_POS, MODE_TRADES) == TRUE) 
       {
       if (OrderMagicNumber() == magic && OrderSymbol() == Symbol ()) 
         {
         openprice = OrderOpenPrice();
         openstoploss = OrderStopLoss();
         while (IsTradeContextBusy()) Sleep ( 500 );
         RefreshRates();
         if (OrderType() == OP_BUY) 
           {
           calculatestoploss = ND(Bid - trailstop * Point );
           if ((Bid > openprice + trailstop * Point ) || (Breakeven == 0 )) 
             {
             if (((calculatestoploss >= openstoploss + trstep * Point ) && (trailstop * Point > stlevel * Point ))) 
               {
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0 , Blue))
                 Print ( "BUY OrderModify Error " + IntegerToString ( GetLastError ()));
               }
             }
           }
         if (OrderType() == OP_SELL) 
           {
           calculatestoploss = ND(Ask + trailstop * Point );
           if ((Ask < openprice - trailstop * Point ) || (Breakeven == 0 )) 
             {
             if (((calculatestoploss <= openstoploss - trstep * Point ) && (trailstop * Point > stlevel * Point ))) 
               {
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0 , Red))
                 Print ( "BUY OrderModify Error " + IntegerToString ( GetLastError ()));
               }
             }
           }
         }
       }
     }
}
//=============================================================================================================================================
double ND( double ad_0) 
{
   return ( NormalizeDouble (ad_0, Digits ));
}  
//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
//
// Permission to trade in this day 
// 
//********************************************************************************************************
bool TradingDay( int hmin, int hmax) // Определение времени и дня разрешения торговли 
{ 
   bool dtrade = false ; 
   switch (DayOfWeek()) 
    {
  
     case 1 : // Monday
       if (Monday == 1 ) dtrade = true ; 
       break ;
     case 2 : // Tuesday 
       if (Tuesday == 1 ) dtrade = true ;
       break ;
     case 3 : // Wednesday
       if (Wednesday == 1 ) dtrade = true ;
       break ;     
     case 4 : // Thursday
       if (Thursday == 1 ) dtrade = true ;
       break ;
     case 5 : // Friday
       if (Friday == 1 ) dtrade = true ;
       break ;
     default : // 
       dtrade = false ;
       break ;
    }
  
   if (dtrade && !(Hour() >= hmin && Hour() <= hmax)) dtrade = true ;
   return dtrade;
}
 
파일:
 
artem artem # :

모든 조건이 충족되면 새 양초에서 주문이 열리지 않도록 만드는 방법을 알려주십시오. 방금 이 코드를 삽입했는데 실제로 4개의 확인 초를 기다리기 시작했지만 1번 주문을 연 후(모든 조건이 충족되었을 때) 다음 모든 초에 대해 주문을 열기 시작했습니다. 조건이 저장되면 이것은 테스터에서 어떻게 보이는지.

+ 만일을 위해 원본 코드를 모두 붙여넣겠습니다. 그렇지 않으면 갑자기 중요한 것을 놓쳤습니다.

미결 주문을 통제(반대)해야 함

 //+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (CheckForOpen()== 0 &&CountTrade( 0 )== 0 ) // Если сигнал для покупок и нет открытых покупок
     {
       if ( OrderSend ( Symbol (),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss* Point ,Ask+TakeProfit* Point , "" ,MagicNumber, 0 ,Blue)) Print ( "BUY OK" );
     }
   if (CheckForOpen()== 1 &&CountTrade( 1 )== 0 ) // Если сигнал для продаж и нет открытых продаж
     {
       if ( OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red)) Print ( "SELL OK" );
     }
  }
//+----------------------------------------------------------------------------+
//| Счетчик ордеров (0)-buy (1)-sell ()-all                                    |
//+----------------------------------------------------------------------------+
int CountTrade( int ot=- 1 )
  {
   int count = 0 ;
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == MagicNumber)
           {
             if (OrderType()==ot||ot< 0 ) count++;
           }  
        }
     }
   return (count);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int     res=- 1 , buy= 0 , sell= 0 ;
   // Считывание параметров индикаторов 3 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 3 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 3 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 3 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 3 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 2 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 2 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 2 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 2 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 2 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 1 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 1 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 1 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 1 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 1 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 0 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 0 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   
   if (buy == 4 ) res= 0 ;
   if (sell== 4 ) res= 1 ;
   return (res);
  }
 
예, 더 이상 재진입이 없었습니다. 그러나 이것이 Countertrade의 방식이라면 최소한 하나의 주문이 열리는 한 새로운 신호에 대한 반응이 없을 것입니다. 이는 필요하지 않습니다. 저것들. 첫 번째 이후에 다시 열면 안 되지만 malw 또는 / 및 macd가 위치를 변경하고 조건에 따라 주문에 입력해야 합니다. 이는 신호 +가 4번 확인되면 신호입니다. 행 => 포지션 열기 . 코드를 추가하려면 아이디어에 따라 모든 것이 준비되어 있어야 합니다. 이를 위해 무엇을 더 추가해야 합니까?
 
artem artem 포지션 열기 . 코드를 추가하려면 아이디어에 따라 모든 것이 준비되어 있어야 합니다. 이를 위해 무엇을 더 추가해야 합니까?
당신이 부분을 주면 그런 쓰레기가 될 것입니다. 이 경우 모든 기능은 귀하가 설명한 조건에 따라 빌드됩니다.
 

나는 MakarFX에서 코드를 변경하려고 시도했고, 결과적으로 이것이 내가 현재 가지고 있는 것입니다:


 #define MagicNumber   122122
extern string s1             = "Trading options" ;
extern double Lot            = 0.01 ;     // размер лота 0 - авт.расчет
extern double StopLoss       = 40 ;     // стоплосс
extern double TakeProfit     = 10 ;     // тейкпрофит
extern double TrailStop      = 21 ;     // уровень без убытка
extern int     Trailing       = 0 ;       // трейлинг стоп 1 вкл. 0 выкл.
extern int     Breakeven      = 0 ;       // перенос стоп лосса в без убыток
extern string s2             = "Day & Hour" ;
extern int     HrStart        = 0 ;       // время начала торговли
extern int     HrEnd          = 23 ;     // время окончания торговли
extern int     Monday         = 1 ;       // Понедельник 1 вкд. 0 выкл.
extern int     Tuesday        = 1 ;       // Вторник
extern int     Wednesday      = 1 ;       // Среда
extern int     Thursday       = 1 ;       // Четверг
extern int     Friday         = 1 ;       // Пятница
//+------------------------------------------------------------------+
// параметры индикаторов
double MovingPeriodLw        = 5 ;      
double MovingPeriodS1        = 75 ;
double MovingPeriodS2        = 85 ;
double StopLevel;
double TrailStep             = 3 ;       // шаг трейлинг стопа
bool OrderBuy = false , OrderSell = false , Order = false , Init = true ;
int timeprev = 0 , Slip = 3.0 ;

//+------------------------------------------------------------------+
//| Init function                                                    |
//+------------------------------------------------------------------+
void OnInit ()
{
   if ( Digits == 3 || Digits == 5 ) { // Пересчет для 5-ти знаков                                                    
      TakeProfit *= 10 ;
      TrailStop *= 10 ;
      TrailStep *= 10 ;
      StopLoss *= 10 ;
      Slip *= 10 ;
   } 
   return ; 
}
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
{
   StopLevel = MarketInfo( Symbol (), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if (timeprev == Time[ 0 ]) return ;
   timeprev = Time[ 0 ];
   
   // Открытие ордера по методу Пуриа
   if (CheckForOpen()== 0 ) // Если сигнал для покупок 
     {
       if ( OrderSend ( Symbol (),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss* Point ,Ask+TakeProfit* Point , "" ,MagicNumber, 0 ,Blue)) Print ( "BUY OK" );
     } 
   if (CheckForOpen()== 1 ) // Если сигнал для продаж 
     {
       if ( OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red)) Print ( "SELL OK" );
     }
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int     res=- 1 , buy= 0 , sell= 0 ;
   // Считывание параметров индикаторов 3 свечи (4ой)
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 3 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 3 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 3 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 3 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 2 свечи (3ей)
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 2 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 2 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 2 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 2 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 1 свечи (2ой)
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 1 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 1 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 1 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 1 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 0 свечи (1ой)
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 0 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   
   if (buy == 4 && OrderSell) { res= 0 ; Order= false ; OrderBuy= true ; OrderSell= false ; } 
   if (sell== 4 && OrderBuy)  { res= 1 ; Order= false ; OrderBuy= false ; OrderSell= true ; }
   return (res);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()   // Расчет объема лота
{
   double Lots;
   if (Lot > 0 ) return (Lot);
   Lots=AccountFreeMargin()/ 5000 ;
   Lots= MathMin ( 15 , MathMax ( 0.01 ,Lots));
   if (Lots< 0.1 ) Lots= NormalizeDouble (Lots, 2 );
   else 
     {
     if (Lots< 1 ) Lots= NormalizeDouble (Lots, 1 );
     else        Lots= NormalizeDouble (Lots, 0 );
     }
   return (Lots);
}
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()   // Опредеоение начального пересечения мувингов
{
   double malw,mas1,mas2;
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );

   if ((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
     Init= false ;
     OrderBuy= true ;
     OrderSell= true ;
     }   
   return ;
}
 
//+------------------------------------------------------------------+
// Treylingstop function                                             |
//+------------------------------------------------------------------+
   // Трейлинг стоп
void RealTrailOrder( double trstop, double trstep, double stlevel, int magic) 
{
   double openprice;
   double openstoploss;
   double calculatestoploss;
   double trailstop = MathMax (trstop, stlevel);
   for ( int cmt = OrdersTotal () - 1 ; cmt >= 0 ; cmt--) 
     {
     if ( OrderSelect (cmt, SELECT_BY_POS, MODE_TRADES) == TRUE) 
       {
       if (OrderMagicNumber() == magic && OrderSymbol() == Symbol ()) 
         {
         openprice = OrderOpenPrice();
         openstoploss = OrderStopLoss();
         while (IsTradeContextBusy()) Sleep ( 500 );
         RefreshRates();
         if (OrderType() == OP_BUY) 
           {
           calculatestoploss = ND(Bid - trailstop * Point );
           if ((Bid > openprice + trailstop * Point ) || (Breakeven == 0 )) 
             {
             if (((calculatestoploss >= openstoploss + trstep * Point ) && (trailstop * Point > stlevel * Point ))) 
               {
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0 , Blue))
                 Print ( "BUY OrderModify Error " + IntegerToString ( GetLastError ()));
               }
             }
           }
         if (OrderType() == OP_SELL) 
           {
           calculatestoploss = ND(Ask + trailstop * Point );
           if ((Ask < openprice - trailstop * Point ) || (Breakeven == 0 )) 
             {
             if (((calculatestoploss <= openstoploss - trstep * Point ) && (trailstop * Point > stlevel * Point ))) 
               {
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), calculatestoploss, OrderTakeProfit(), 0 , Red))
                 Print ( "BUY OrderModify Error " + IntegerToString ( GetLastError ()));
               }
             }
           }
         }
       }
     }
}
//=============================================================================================================================================
double ND( double ad_0) 
{
   return ( NormalizeDouble (ad_0, Digits ));
}  
//нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
//
// Permission to trade in this day 
// 
//********************************************************************************************************
bool TradingDay( int hmin, int hmax) // Определение времени и дня разрешения торговли 
{ 
   bool dtrade = false ; 
   switch (DayOfWeek()) 
    {
  
     case 1 : // Monday
       if (Monday == 1 ) dtrade = true ; 
       break ;
     case 2 : // Tuesday 
       if (Tuesday == 1 ) dtrade = true ;
       break ;
     case 3 : // Wednesday
       if (Wednesday == 1 ) dtrade = true ;
       break ;     
     case 4 : // Thursday
       if (Thursday == 1 ) dtrade = true ;
       break ;
     case 5 : // Friday
       if (Friday == 1 ) dtrade = true ;
       break ;
     default : // 
       dtrade = false ;
       break ;
    }
  
   if (dtrade && !(Hour() >= hmin && Hour() <= hmax)) dtrade = true ;
   return dtrade;
}
 

강조 표시된 것은 내가 나 자신으로부터 기여하려고 한 것입니다. 결과적으로 모든 것이 제대로 작동 하지만 구매 시에만 거래가 이루어집니다. 판매에도 열리도록 만드는 방법, 누가 압니까???

 
artem artem # :

나는 MakarFX에서 코드를 변경하려고 시도했고, 결과적으로 이것이 내가 현재 가지고 있는 것입니다:


강조 표시된 것은 내가 나 자신으로부터 기여하려고 한 것입니다. 결과적으로 모든 것이 제대로 작동 하지만 구매 시에만 거래가 이루어집니다. 판매에도 열리도록 만드는 방법, 누가 압니까???

처음에 "true"를 입력해 보세요.
 bool OrderBuy = false , OrderSell = false ,