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

 
MakarFX , 나는 그것을 시도했다 - 변화 없음, 그것은 또한 구매를 위해서만 열리고 판매는 완전히 무시됩니다 ...
 
artem artem # :
MakarFX , 나는 그것을 시도했다 - 변화 없음, 그것은 또한 구매를 위해서만 열리고 판매는 완전히 무시됩니다 ...
따라서 bool을 전환하는 조건이 없다는 결론
 
그렇다면 조건을 갖추기 위해 무엇을 추가해야 합니까?
 
artem artem # :
그렇다면 조건을 갖추기 위해 무엇을 추가해야 합니까?

논리를 설명...

첫 번째는 분명합니다. 신호는 있고 주문은 없습니다. 우리는 문을 엽니다...

그런 다음 어떤 조건에서 주문을 열거 나 닫을 수 있는지 이해하지 못합니다.

 
artem artem # :
그렇다면 조건을 갖추기 위해 무엇을 추가해야 합니까?

이 시도

 //+------------------------------------------------------------------+
//| 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))
         { Order= false ; OrderBuy= true ; OrderSell= false ; Print ( "BUY OK" ); } 
     } 
   if (CheckForOpen()== 1 ) // Если сигнал для продаж 
     {
       if ( OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red))
         { Order= false ; OrderBuy= false ; OrderSell= true ; 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 ;
   if (sell== 4 && OrderBuy)   res= 1 ;
   return (res);
  }
//+------------------------------------------------------------------+
 

자, 이제 모든 것을 순서대로 설명하겠습니다. 구체적으로 물을 붓지 않고 ...

추세 거래 전략 "퓨리아의 방법"이 기본으로 사용됩니다. 세 이동 평균의 교차점과 MACD 막대의 시작점을 기반으로 합니다. 마침표(75)와 (85)가 있는 두 개의 느린 항목은 선형 가중치 방법을 낮음에 적용합니다. 마침표(5)의 빠른 평균, 지수 방법, 닫기에 적용합니다. 매개변수 15/26/1이 있는 MACD 표시기 . 진입점은 빠른 이동 평균이 두 개의 느린 평균을 교차하고 MACD 막대가 빠른 것과 해당 영역에서 열릴 때 형성됩니다(빠른 것과 MACD 막대는 동일한 영역에 있어야 함 ).

  • BUY 신호 - MA(5)가 교차하여 MA(75)와 MA(85) 위에 있는 반면 MACD는 양의 영역에 오픈 바가 있습니다.
  • 매도 신호 - MA(5)가 교차하여 MA(75)와 MA(85) 아래에 있는 반면 MACD는 음의 영역에 오픈 바가 있습니다.

EA는 고정 이익과 손절매를 넣습니다. 이익과 정지의 크기는 초기 매개변수에서 설정됩니다. 이익실현 또는 손절매에 도달한 경우에만 주문을 마감합니다.

이것은 원래 Puria 고문에 있던 것입니다. 또한 최신 버전에는 후행 정지 및 특정 시간까지 거래할 수 있는 옵션이 있습니다. 기능은 유용하지만 지금은 별로 관심이 없습니다.

이제 실제로 내가 추가한/추가하고 싶은 사항은 다음과 같습니다.

1. 그렇게 하라   거래 개시   그리고   모든 지표 조건 준수 확인   (빠른(5) 두 개의 느린(75)(85) 막대를 교차하고 빠른(5)와 같은 방향으로 MACD 막대를 여는 작업을 수행했습니다.   새 양초의 시가로만   (각 30분 초의 첫 번째 틱) . 이미 처리했습니다.
  1. 지표를 "제로화"하기 위한 조건을 만듭니다 . 예를 들어,   빠른 이동 평균의 경우(5) : 느린 이동 평균보다 높으면 매수 신호입니다. 그 후 하락 하여 느린 이동 평균 (75)과 (85) 중 하나에 닿거나 그 사이에 있으면   -그런 다음 빠른 이동 평균의 신호,   "제로화" 되고 그러한 상태로 유지됩니다.   slow 에 닿거나 그 사이에 머무르는 한 "0" 위치 입니다. 그 이후라면,   빠른 것은 한 방향으로 느린 것을 모두 교차합니다.   (느린 쪽을 만지기 전에 온 방향으로 돌아온 경우 포함) - 이것은 이 표시기의 신호입니다 .   MACD도 상황은 비슷합니다.   - 오직   "0"은 MACD=0이 됩니다.   (촛불에 1. MACD가 열린 경우, 예를 들어 값이   0.0043 , 그리고 양초에 2. 값으로   -0.0010 , 그래서   "영"   양초의 MACD 2. 새로운 신호 발행). 그러나 한 가지 사항이 있습니다.   빠르고(5) MACD는 "동등한 기반"이어야 합니다.   — (5)가 느린 양초에 비해 상대적으로 위치를 변경하지 않고 이때 MACD가 반대 영역의 마지막 양초(입력 없음)와 빠른 양초와 동일한 지역의 다음 양초에서 열린 경우, 그러면 모든 조건이 수렴되고 영장이 발부되어야 합니다.   나는 이 모든 것이 양초의 시가에만 있어야 한다는 사실에 주의를 기울입니다 .
  1. 자, 사실 마지막입니다. 지표에 대한 모든 조건이 일치한 후(양초의 시가에서),   EA는 연속으로 4개의 양초 시가를 기다렸습니다 .

    1. 첫 번째 캔들의 시가 - (5) (75) 및 (85) + MACD 바가 0 이상 - 확인 4개 중 1개 ;
    2. 두 번째 캔들 시가 - (5) (75), (85) + MACD 바 0 이상 시가 -   4개 중 2개의 확인이 ;
    3. 3번째 캔들 시가 - (5) (75), (85) + MACD 바 0 이상 시가 -   4건 중 3건은 ;
    4. 4번째 캔들 시가 - (5) (75), (85) + MACD 바 0 이상 시가 -   4개 중 4개 확인    같은 양초(4일)에 매수할 거래를 엽니다.
에 대한 주문과 유사한 상황   매도 , 지표만 다른 방향으로 열려야 합니다. 그리고 중요한 점이 있습니다. 예를 들어 첫 번째 양초에서 네 번째 양초까지의 어느 단계에서나   표시기는 위치를 변경합니다   (예를 들어, 3번째 시가 캔들에서 MACD 막대는 0 또는 = 0 아래에서 열립니다) – 그러면 모든 것이 재설정됩니다. 신호 는 연속 으로 4 개의 촛불 을 여는 테스트 를 통과 하지 못했습니다 .


이와 같이 명확하지 않고 질문이 있는 경우 질문하십시오.

 
artem artem # :

자, 이제 모든 것을 순서대로 설명하겠습니다. 구체적으로 물을 붓지 않고 ...


  1. 지표를 "제로화"하기 위한 조건을 만듭니다 .

이것이 널링이다.

   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ; }
   if (malw<mas1&&malw<mas2&&macd< 0 ) { buy= 0 ; sell+= 1 ;}

제가 당신을 제대로 이해하지 못한 것일 수도...

스크린샷을 만들려고

 
스크린샷을 첨부했습니다. 명확하지 않은 경우 질문하세요.
파일:
 
artem artem # :
스크린샷을 첨부했습니다. 명확하지 않은 경우 질문하세요.
이해해요, 제 생각에는
 
artem artem # :
스크린샷을 첨부했습니다. 명확하지 않은 경우 질문하세요.

그리고 이것을 시도하십시오 - 그 장소에서 열릴까요?

 //+------------------------------------------------------------------+
//|                                                  artem artem.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property strict
//---
#define MagicNumber   122122
//---
#include <stdlib.mqh> // Стандартная библиотека
//---
input string s0 = "Баланс" ;             // 1
input string Template       = "ADX" ;   // Имя шаблона(without '.tpl')
input double TargetProfit   = 1000000 ; // Баланс + Прибыль(прибавить к балансу)
input double TargetLoss     = 0 ;       // Баланс - Убыток(отнять от баланса)
input string s1 = "Размер лота" ;       // 2
input double Lot            = 0.01 ;     // размер лота 0 - авт.расчет
input string s2 = "TP SL" ;             // 3
input double InpTProfit     = 1000 ;     // Exchange TP
input double InpStopLoss    = 1000000 ; // Exchange SL
input string s3 = "Индикатор" ;         // 4
input int     MovingPeriodLw = 13 ;       // MovingPeriodLw
input int     MovingPeriodS1 = 89 ;       // MovingPeriodS1
input int     MovingPeriodS2 = 144 ;     // MovingPeriodS2
input string s4 = "Day & Hour" ;         // 5
input int     HrStart        = 0 ;       // время начала торговли
input int     HrEnd          = 23 ;       // время окончания торговли
//+------------------------------------------------------------------+
int     Monday         = 1 ;       // Понедельник 1 вкд. 0 выкл.
int     Tuesday        = 1 ;       // Вторник
int     Wednesday      = 1 ;       // Среда
int     Thursday       = 1 ;       // Четверг
int     Friday         = 1 ;       // Пятница
//+------------------------------------------------------------------+
uint SLEEPTIME= 1 ;
double Price[ 2 ];
datetime timeprev= 0 ;
ENUM_TIMEFRAMES TimeFrame= PERIOD_CURRENT ;
bool OrderBuy= false ,OrderSell= false ,Order= false ,Init= true ,ClOp= true ;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//--- Закрыть Общий профит или профит на паре
   if (ProfitTarget())
     {
       return ;
     }
//--- Закрыть профит BUY или SELL на паре
   ProfitOnTick();
// Определение направления пересечения мувингов
   if (Init)
      InitMetod();
// Ожидание нового бара на графике
   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 , 12 , 26 , 9 , 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, 3 , 0 , 0 , "" ,MagicNumber, 0 ,Blue);
      Order= false ;
       return ;
     }
// Открываем ордер Sell
   if (macd< 0 && OrderSell && Order)
     {
      res= OrderSend ( Symbol (),OP_SELL,Lots(),Bid, 3 , 0 , 0 , "" ,MagicNumber, 0 ,Red);
      Order= false ;
       return ;
     }
  }
//+------------------------------------------------------------------+
//| 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 ;
  }
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+
// 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;
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool ProfitTarget( void )
  {
   bool res= false ;
   if ( AccountInfoDouble ( ACCOUNT_EQUITY )<=TargetLoss ||
       AccountInfoDouble ( ACCOUNT_EQUITY )>=TargetProfit)
     {
      CloseAllOrders();
       Sleep (SLEEPTIME* 1000 );
      CloseAllOrders();
       ExpertRemove ();
      DeleteChart();
       PlaySound ( "expert.wav" );
      res= true ;
     }
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool ProfitOnTick( void )
  {
   bool res= false ;
   double PROFIT_BUY= 0.00 ;
   double PROFIT_SELL= 0.00 ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) // returns the number of open positions
     {
       if ( OrderSelect (i,SELECT_BY_POS) && OrderSymbol()== Symbol ())
        {
         if (OrderSymbol()== Symbol () && OrderType()==OP_BUY)
           {
            PROFIT_BUY=PROFIT_BUY+ NormalizeDouble (OrderProfit(), 2 );
           }
         if (OrderSymbol()== Symbol () && OrderType()==OP_SELL)
           {
            PROFIT_SELL=PROFIT_SELL+ NormalizeDouble (OrderProfit(), 2 );
           }
        }
     }
   int Close_ticketb= 0 ;
   int totalb= OrdersTotal ();
   int b = 0 ;
   for (b = totalb; b >= 0 ; b--)
     {
       if ( OrderSelect (b,SELECT_BY_POS) && OrderSymbol()== Symbol ())
        {
         //OrderSelect(i,SELECT_BY_POS);
         if (OrderSymbol()== Symbol () && OrderType()==OP_BUY)
           {
             if (PROFIT_BUY<-InpStopLoss || PROFIT_BUY>=InpTProfit)
              {
               Close_ticketb = OrderClose(OrderTicket(),OrderLots(),MarketInfo( Symbol (),MODE_BID), 5 );
               PlaySound ( "ok.wav" );
              }
           }
        }
      res= true ;
     }
   int Close_tickets= 0 ;
   int totals= OrdersTotal ();
   int s = 0 ;
   for (s = totals; s >= 0 ; s--)
     {
       if ( OrderSelect (s,SELECT_BY_POS) && OrderSymbol()== Symbol ())
        {
         if (OrderSymbol()== Symbol () && OrderType()==OP_SELL)
           {
             if (PROFIT_SELL<-InpStopLoss || PROFIT_SELL>=InpTProfit)
              {
               Close_tickets = OrderClose(OrderTicket(),OrderLots(),MarketInfo( Symbol (),MODE_ASK), 5 );
               PlaySound ( "ok.wav" );
              }
           }
        }
      res= true ;
     }
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void CloseAllOrders( void )
  {
   int iOrders= OrdersTotal ()- 1 , i;
   if (ClOp)
     {
       for (i=iOrders; i>= 0 ; i--)
        {
         if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() &&
            !OrderClose(OrderTicket(),OrderLots(),Price[ 1 -OrderType()], 0 ))
             Print (OrderError());
         if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
           {
             if (OrderDelete(OrderTicket()))
               Print (OrderError());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError( void )
  {
   int iError= GetLastError ();
   return ( StringConcatenate ( "Order:" ,OrderTicket(), " GetLastError()=" ,iError, " " ,ErrorDescription(iError)));
  }
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo( void )
  {
   RefreshRates();
   Price[ 0 ]=MarketInfo(OrderSymbol(),MODE_ASK);
   Price[ 1 ]=MarketInfo(OrderSymbol(),MODE_BID);
   double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
   if (dPoint== 0 )
       return ( false );
   return (Price[ 0 ]> 0.0 && Price[ 1 ]> 0.0 );
  }
//+------------------------------------------------------------------+
//| start function                                                   |
//+------------------------------------------------------------------+
void DeleteChart( void )
  {
   long currChart,prevChart= ChartFirst ();
   int i= 0 ,limit= 100 ;
   bool errTemplate;
   while (i<limit)
     {
      currChart= ChartNext (prevChart);
       if (TimeFrame!= PERIOD_CURRENT )
        {
         ChartSetSymbolPeriod (prevChart, ChartSymbol (prevChart),TimeFrame);
        }
      errTemplate= ChartApplyTemplate (prevChart,Template+ ".tpl" );
       if (!errTemplate)
        {
         Print ( "Error " , ChartSymbol (prevChart), "-> " , GetLastError ());
        }
       if (currChart< 0 )
         break ;
       Print (i, ChartSymbol (currChart), " ID =" ,currChart);
      prevChart=currChart;
      i++;
     }
  }
//+------------------------------------------------------------------+
사유: