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

[삭제]  

도움이 필요합니다 - 역전 중지 - 3개의 주문이 있지만 비디오 자습서에서 후행하는 예 :) 관련 없는 주문에 대해서만, 그러나 저에게는 알고리즘으로 연결되어 있습니다. 즉, 이익을 취하는 것은 3개의 주문의 합으로 계산됩니다. , 또는 트렌드에 즉시 도달하는 경우 하나입니다. 글쎄, 나는 뭔가를 생각해 냈지만 고문은 더 많이 벌지 않았습니다. 그는 같은 금액을 벌기 시작했지만 후행없이 이전 거래와 비교하여 2-3 배 적은 거래를 얻습니다. 일반적으로 나는 후행이 없지만 일종의 탁도가 있습니다. 관련 주문에 대해 어떻게 할 수 있습니까? 누가 나에게 아이디어를 줄 수 있습니까? 나는 다른 것을 생각해내지 못할 것 같습니다. 여기 내 "후행"의 결과가 있습니다. 파란색으로 강조 표시되어 있습니다.

1번 테스트 결과를 첨부합니다. 후행 정지가 있습니까? 이해가 안 됩니다. 같은 기간 이익이 증가하지 않은 이유는 무엇입니까? 그리고 거래건수 만 2~3배 줄었나요?

//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern int     TakeProfit     = 5;
extern int     Step           = 2;

extern int     TrailingStep   = 3;
extern int     TrailingStop   = 1;

extern int     MaPeriod       = 200;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{  if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if(tp>TakeProfit)
   {
      TakeProfit+=tp;
   }

   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1)//CountBuy()==1 && 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1)//CountSell()==1 && 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1)//CountBuy() + CountSell()==2 && 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1)//CountSell() + CountBuy()==2 && 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   

   if (op>=tp)
   {
         CloseAll();    
   }
   
   

 
   
   
   
   
   
   
   






}    
//---------------------------------------------------------------------------------------
//   double Equity() //или OrderProfit() - эти идеи в работе и задуманы как автоподбор лота (без мартингейла) для снижения рисков от контрдвижения (интервенций) рынка 
//   {
//      double eqv=0;
//      eqv+=AccountEquity();
//      return(eqv);     
//   }
//---------------------------------------------------------------------------------------
void Trailing()

{
   for (int i=OrdersTotal() -1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType() == OP_BUY)
            
            {
               price=FindLastBuyPrice();   
               if (Bid - price > (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point < Bid - (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
            
            if (OrderType() == OP_SELL)
            {
               price=FindLastSellPrice();
               if (price - Ask > (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point > Ask + (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
         }
      }
   }
}
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   double oprofit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               oprofit+=OrderProfit();
              }
           }
        }
     }
   return(oprofit);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
double FindLastBuyPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
      {  
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+



Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc :

도움이 필요합니다 - 스탑 플립이 있습니다 - 3개의 주문이 있지만 후행 예는 관련 없는 주문에만 해당되지만 저에게는 알고리즘으로 연결되어 있습니다. 즉시 추세에 도달합니다. 글쎄, 나는 뭔가를 생각해 냈지만 고문은 더 많이 벌지 않았습니다. 그는 같은 금액을 벌기 시작했지만 후행없이 이전 거래와 비교하여 2-3 배 적은 거래를 얻습니다. 일반적으로 나는 후행이 없지만 일종의 탁도가 있습니다. 관련 주문에 대해 어떻게 할 수 있습니까? 누가 나에게 아이디어를 줄 수 있습니까? 나는 다른 것을 생각해 내지 않을 것 같아 두렵습니다. 여기 내 "후행"의 결과가 빨간색으로 강조 표시되어 있습니다.


누군가가 발보 형태로 배치된 코드를 이해할 것이라고 생각합니까?
[삭제]  
Vitaly Muzichenko :
누군가가 발보 형태로 배치된 코드를 이해할 것이라고 생각합니까?

어떻게 보여야 할까요? 글쎄, 나는 코드를 던질 수 없다. 그렇지 않으면 무엇이 무엇인지 명확하지 않을 것이다.
 
geratdc :

어떻게 보여야 할까요? 글쎄, 나는 코드를 던질 수 없다. 그렇지 않으면 무엇이 무엇인지 명확하지 않을 것이다.

적어도 다음과 같이:


[삭제]  
Vitaly Muzichenko :

적어도 다음과 같이:



누군가가 다시 했습니다. 그게 더 낫습니다. 감사합니다.
 


친구, 저는 MQL4를 배우고 있으며 Lazy Trader 시스템에 대한 Expert Advisor를 작성 하기로 결정했습니다.
Expert Advisor가 작성되었지만 제대로 작동하지 않습니다. 내가 보는 오류는 주문이 제 시간에 마감되지 않는다는 것입니다. 아마도 다른 오류가 있을 수 있습니다.


오류를 찾는 데 도움을 주고 표시되는 코드에 대한 피드백을 제공하세요.

다음은 내가 Expert Advisor를 작성한 시스템의 규칙입니다.

1/ 주의 시작에 우리는 첫 4시간 촛불의 마감을 기다립니다.
2/ 보류 중인 매수 스탑 및 매도 스탑 주문은 이 양초의 고점보다 20핍, 저점보다 20핍 낮습니다.
3/ 손절매는 반대의 수준에 놓입니다. 이익실현이 설정되지 않았습니다.
4/ 주문이 손절매와 같은 이익에 도달하면 손절매를 손익분기점으로 이동합니다(포지션의 손절매를 시작 가격으로 이동).
5/ 1차 활성화 후 2차 주문, DO NOT DELETE!
6/ 주말에 손익에 관계없이 모든 주문을 삭제/닫습니다.

도와 주셔서 감사합니다:)

어드바이저 코드가 있는 파일을 첨부합니다

파일:
 
ivan-baaton :


친구, 저는 MQL4를 배우고 있으며 Lazy Trader 시스템에 대한 Expert Advisor를 작성 하기로 결정했습니다.
Expert Advisor가 작성되었지만 제대로 작동하지 않습니다. 내가 보는 오류는 주문이 제 시간에 마감되지 않는다는 것입니다. 아마도 다른 오류가 있을 수 있습니다.


오류를 찾는 데 도움을 주고 표시되는 코드에 대한 피드백을 제공하세요.

다음은 내가 Expert Advisor를 작성한 시스템의 규칙입니다.

1/ 한 주의 시작에 우리는 첫 4시간 촛불의 마감을 기다립니다.
2/ 보류 중인 매수 스탑 및 매도 스탑 주문은 이 양초의 고점보다 20핍, 저점보다 20핍 낮습니다.
3/ 손절매는 반대의 수준에 놓입니다. 이익실현이 설정되지 않았습니다.
4/ 주문이 손절매와 같은 이익에 도달하면 손절매를 손익분기점으로 이동합니다(포지션의 손절매를 시작 가격으로 이동).
5/ 1차 활성화 후 2차 주문, DO NOT DELETE!
6/ 주말에 손익에 관계없이 모든 주문을 삭제/닫습니다.

도와 주셔서 감사합니다:)

어드바이저 코드가 있는 파일을 첨부합니다

 TimeHour ( TimeCurrent ()) == DayTimeClose

이러한 절대적인 평등은 극히 드물며, 주일이 23시에 마감되면 최소 15분 이상 일찍 주문을 마감하는 것이 좋습니다. 다른 오류는 찾아보지 않았습니다. 얼핏 보면 아주 깔끔하게 쓰여져 있다.

 
Alexey Viktorov :

이러한 절대적인 평등은 극히 드물며, 주일이 23시에 마감되면 최소 15분 이상 일찍 주문을 마감하는 것이 좋습니다. 다른 오류는 찾지 않았습니다. 얼핏 보면 아주 깔끔하게 쓰여져 있다.

주중 마감 - 00:00, 즉 1시간 일찍 주문을 마감합니다.


이 코드에서 잘못된 점: TimeHour ( TimeCurrent ()) == DayTimeClose ?


이 코드의 어딘가에 오류가 있는 것 같습니다.


(int i = OrdersTotal(); i>=0; i--)
{
if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber( ) == 마법)
{
ticket_sell = OrderClose(ticket_sell, 랏, 비드, 3, 레드);
if (티켓_판매 == 거짓)
Print(" 판매 주문 이 마감되지 않았습니다.");
}

}


감사해요

 
ivan-baaton :

주중 마감 - 00:00, 즉 1시간 일찍 주문을 마감합니다.


이 코드에서 잘못된 점: TimeHour ( TimeCurrent ()) == DayTimeClose ?


이 코드의 어딘가에 오류가 있는 것 같습니다.


for ( int i = OrdersTotal(); i>=0; i--)
{
if (OrderSelect( k , SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber ) == 마법)
{
ticket_sell = OrderClose(ticket_sell, 랏, 비드, 3, 레드);
if (티켓_판매 == 거짓)
Print(" 판매 주문 이 마감되지 않았습니다.");
}

}


감사해요

이것이 바로 제가 보여준 것입니다. 지금은 내가 부주의했음을 알지만. 강조 표시된 TimeHour( TimeCurrent() ) == DayTimeClose만 보았습니다.

사이클 카운터는 다음과 같습니다. i와 주문 k가 선택되어 있는데 이것을 바로 보지는 못했습니다.

[삭제]  
Alexey Viktorov :

이것이 바로 제가 보여드린 것입니다. 지금은 내가 부주의했음을 알지만. 강조 표시된 TimeHour( TimeCurrent() ) == DayTimeClose만 보았습니다.

사이클 카운터는 다음과 같습니다. i와 주문 k가 선택되어 있는데 이것을 바로 보지는 못했습니다.


예, 이 K가 상단 헤더의 외부 변수 에도 표시됩니다. 아마도 이것은 일부 함수의 반환 값일 것입니다 ...


Alexey, 내 문제에 대해 무엇을 말할 수 있습니까? 중지 취소 명령을 지키려는 추적. 이것을 만난 적이 있습니까?