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

 
MakarFX :
수동으로 주문한 사항을 함께 처리하는 고문이 있습니까?
네. 수동으로 지연을 설정하거나 거래를 열면 어드바이저가 작동합니다.
 
SGarnov :
컴파일되지 않는 것을 삽입하려고 했습니다. 모든 코드를 공개하고, 필요한 경우 컴파일 화면을 공개합니다. 또한 문제가 있다고 생각합니다. 내 테이크는 계수 (외부 변수)를 통해 정지와 관련하여 설정되어 있으며 수동 설정으로 변경할 수 있으며 고문이 추가하기가 더 쉬울 것입니까?

기능

   double GetPointLastLoss(){
             datetime t= 0 ;
             double result= 0 ,p= 0 ,tp= 0 ;
             int i=OrdersHistoryTotal(),magic= 0 ;
         for ( int pos= 0 ; pos<i; pos++)
         {
           if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
         {
           if ((OrderSymbol()== _Symbol ) && (OrderMagicNumber()==magic))
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime())
                 {t=OrderCloseTime(); p=OrderProfit(); tp=OrderType();
                   if (tp==OP_BUY&&p< 0 )
                    {
                     result=OrderOpenPrice()-OrderClosePrice();
                    } else {result= 0 ;}
                   if (tp==OP_SELL&&p< 0 )
                    {
                     result=OrderClosePrice()-OrderOpenPrice();
                    } else {result= 0 ;}
                 }
              }
           }
        }
     }
   return (result);
  }

전역 범위에서 제거하십시오. magic=0이 컴파일을 위해 멈췄습니다.

magic= 0

	          
 
Galim_V :

기능

전역 범위에서 제거하십시오. magic=0이 컴파일을 위해 멈췄습니다.

제거됨, 컴파일 오류가 없으며 외부 변수 int tp=0을 참조하여 tp=0 열에 있는 함수의 세 번째 줄에 1개의 경고만 나타납니다. 나는 그가 무엇을 좋아하지 않는지 잘 이해하지 못합니다. 나는 모든 코드를 동봉합니다. 수정이 어렵지 않다면 진실은 가까운 곳에 있습니다.

 input int takeProfitC = 2 ; // Коэффициент Take Profit
input int stop_loss = 100 ; //Уровень Stop Loss
input int stop_count = 2 ; //Количество Stop Loss
input double lots = 0.01 ; //Лоты
input int slippage = 30 ; //Проскальзывание
input int datePeriod = 48 ; // Время удержания при SL


int tp = 0 ;
int tpc = 0 ;
double tp_price_old = 777 ;
int stopLossCount = 0 ;
datetime startOrder = 0 ;
int pending_ticket = 0 ;
int lastMagic = 0 ;
bool isLimitOn = false ;
bool isStart = True;
datetime startTime = 0 ;
bool isFinal = false ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit () {
//
   //OrderSend(Symbol(), OP_SELL, 0.01, 0.76228, 300, 0, 0);
   //OrderSend(Symbol(), OP_SELLSTOP, 0.01, 0.77057, 300, 0, 0);
   //OrderSend(Symbol(), OP_BUYSTOP, 0.01, 0.76928, 300, 0, 0);
   tp = stop_loss * takeProfitC;
//---
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason) {
//--

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick () {
//---
//Comment("StopCount: " + stopLossCount + "\n" + "CurrentStopC: " + stop_count);
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS)) {
         if (OrderSymbol() == Symbol ()) {
         int magic = OrderMagicNumber();
             if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderOpenTime()) {
               int ticket = OrderTicket();
               if (!findPending(ticket)) {
                   if ( OrderSelect (ticket, SELECT_BY_TICKET) && ((( TimeCurrent () <= (startTime + datePeriod * 3600 ))) || isStart)) {
                     if (OrderType() == OP_BUY) {
                         double sl_price = NormalizeDouble (OrderOpenPrice() - Point () * MathMax (stop_loss, MarketInfo( Symbol (), MODE_STOPLEVEL)), Digits );
                         double tp_price = NormalizeDouble ((OrderOpenPrice() + Point () * (tp)), Digits );
                         if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl_price, tp_price, OrderExpiration())) {
                           Print ( "Ошибка модификации ордера:" , GetLastError ());
                        } else {
                           if (stopLossCount < stop_count && tp_price != tp_price_old){
                              pending_ticket = OrderSend ( Symbol (), OP_SELLSTOP, lots, sl_price, slippage, 0 , 0 , NULL , OrderTicket());
                              lastMagic = ticket;
                              isLimitOn = true ;
                               if (isStart){
                                 startTime = TimeCurrent ();
                                 isStart = false ;
                              }
                              tp_price_old = tp_price;
                              stopLossCount++;                         
                           }
                        }
                     } else if (OrderType() == OP_SELL) {
                         double sl_price = NormalizeDouble (OrderOpenPrice() + Point () * MathMax (stop_loss, MarketInfo( Symbol (), MODE_STOPLEVEL)), Digits );
                         double tp_price = NormalizeDouble ((OrderOpenPrice() - Point () * (tp)), Digits );
                         if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl_price, tp_price, OrderExpiration())) {
                           Print ( "Ошибка модификации ордера:" , GetLastError ());
                        } else {
                           if (stopLossCount < stop_count && tp_price != tp_price_old){
                              pending_ticket = OrderSend ( Symbol (), OP_BUYSTOP, lots, sl_price, slippage, 0 , 0 , NULL , OrderTicket());
                              lastMagic = ticket;
                              isLimitOn = true ;
                               if (isStart){
                                 startTime = TimeCurrent ();
                                 isStart = false ;
                              }
                              stopLossCount++;
                              tp_price_old = tp_price;  
                          }
                        }
                     }
                  }
               }
         }
         if (startTime > 0 && ( TimeCurrent () >= (startTime + datePeriod * 3600 ))){
            deletePending(lastMagic);
            isFinal = true ;
         }
            
         if (lastMagic != 0 && !IsSell() && !IsBuy() && magic == lastMagic) {
            tpc = 0 ;
            startTime = 0 ;
            stopLossCount = 0 ;
            deletePending(lastMagic);
            isStart = true ;
            }
         }
     }
   }
   if ((startTime > 0 || isFinal) && !IsSell() && !IsBuy()){
            tpc = 0 ;
            startTime = 0 ;
            stopLossCount = 0 ;
            isStart = true ;
            isFinal = false ;
   }
}
//+----------------------------------------------------------------------------+
//|  Возвращает пункты убытка последнего закрытого ордера в пунктах            |
//+----------------------------------------------------------------------------+
double GetPointLastLoss(){
             datetime t= 0 ;
             double result= 0 ,p= 0 ,tp= 0 ;
             int i=OrdersHistoryTotal(),magic= 0 ;
         for ( int pos= 0 ; pos<i; pos++)
         {
           if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
         {
           if ((OrderSymbol()== _Symbol ) && (OrderMagicNumber()==magic))
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime())
                 {t=OrderCloseTime(); p=OrderProfit(); tp=OrderType();
                   if (tp==OP_BUY&&p< 0 )
                    {
                     result=OrderOpenPrice()-OrderClosePrice();
                    } else {result= 0 ;}
                   if (tp==OP_SELL&&p< 0 )
                    {
                     result=OrderClosePrice()-OrderOpenPrice();
                    } else {result= 0 ;}
                 }
              }
           }
        }
     }
   return (result);
  }                                                                
//+------------------------------------------------------------------+
bool findPending( int ticket) {
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS)) {
         if (OrderMagicNumber() == ticket) {
             return true ;
         }
      }
   }

   for ( int i = OrdersHistoryTotal() - 1 ; i >= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber() == ticket) {
             return true ;
         }
      }
   }
   return false ;
}
//+------------------------------------------------------------------+
void deletePending( int magic) {
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS)) {
         if (OrderMagicNumber() == magic) {
             if (OrderType() != OP_BUY && OrderType() != OP_SELL) {
               if (!OrderDelete(OrderTicket())) {
                   Print ( "Ошибка удаления отложеного одера: " , GetLastError ());
               }
            }
             break ;
         }
      }
   }
}
//+------------------------------------------------------------------+
bool IsSell()
{
   int count = 0 ;
   for ( int trade = OrdersTotal () - 1 ; trade >= 0 ; trade--)
   {
       if ( OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) 
          && OrderSymbol() == Symbol ()
          && OrderType() == OP_SELL)
      {
         count++;
      }
      
   }
   if (count == 0 )
       return false ;
   else
       return true ;
}
//+------------------------------------------------------------------+
bool IsBuy()
{
   int count = 0 ;
   for ( int trade = OrdersTotal () - 1 ; trade >= 0 ; trade--)
   {
       if ( OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) 
          && OrderSymbol() == Symbol ()
          && OrderType() == OP_BUY)
      {
         count++;
      }
      
   }
   if (count == 0 )
       return false ;
   else
       return true ;
}
 
SGarnov :

제거됨, 컴파일 오류가 없으며 외부 변수 int tp=0을 참조하여 tp=0 열에 있는 함수의 세 번째 줄에 1개의 경고만 나타납니다. 나는 그가 무엇을 좋아하지 않는지 잘 이해하지 못합니다. 나는 모든 코드를 동봉합니다. 수정이 어렵지 않다면 진실은 가까운 곳에 있습니다.

이와 같이

 //+------------------------------------------------------------------+
//|                                                   SGarnov.v2.mq4 |
//|                                           Copyright 2020, DrMak. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, DrMak."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property strict
//--- input parameters
input int       T_Profit = 2 ;     // Коэффициент Take Profit
input int       S_Loss   = 100 ;   // Уровень Stop Loss
input double    O_Lots   = 0.01 ;   //Лоты
input int       Input4;
input int       Input5;
input int       Input6;

double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- 
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   t_profit = S_Loss*T_Profit;
   s_loss   = MathMax (S_Loss, MarketInfo( Symbol (), MODE_STOPLEVEL));
   // Проверяем наличие ордеров BUY
   if (CountOrders( _Symbol , 0 )> 0 )
     {
       // Проверяем последний закрытый ордер SELL на наличие убытка в пунктах
       if (GetPointLastLoss( 1 )> 0 )
        {
         // Если убыток есть, то добавляем пункты убытка
         sl_price = NormalizeDouble ( Point () * s_loss, Digits );
         tp_price = NormalizeDouble (GetPointLastLoss( 1 )+ Point () * t_profit, Digits );
         ModifyOrder( _Symbol , sl_price, tp_price);
        }
       else
        {
         // Если убытка нет
         sl_price = NormalizeDouble ( Point () * s_loss, Digits );
         tp_price = NormalizeDouble ( Point () * t_profit, Digits );
         ModifyOrder( _Symbol , sl_price, tp_price);
        }
     }
   // Проверяем наличие ордеров SELL
   if (CountOrders( _Symbol , 1 )> 0 )
     {
       // Проверяем последний закрытый ордер BUY на наличие убытка в пунктах
       if (GetPointLastLoss( 0 )> 0 )
        {
         // Если убыток есть, то добавляем пункты убытка
         sl_price = NormalizeDouble ( Point () * s_loss, Digits );
         tp_price = NormalizeDouble (GetPointLastLoss( 0 )+ Point () * t_profit, Digits );
         ModifyOrder( _Symbol , sl_price, tp_price);
        }
       else
        {
         // Если убытка нет
         sl_price = NormalizeDouble ( Point () * s_loss, Digits );
         tp_price = NormalizeDouble ( Point () * t_profit, Digits );
         ModifyOrder( _Symbol , sl_price, tp_price);
        }
     }
  }
//+--------------------------------------------------------------------------------------------------------------------+
//| Подсчет ордеров по типу                                                                                            |
//+--------------------------------------------------------------------------------------------------------------------+
//|  0 - ордера типа BUY          1 - ордера типа SELL                                                                 |
//|  2 - ордера типа BUYLIMIT     3 - ордера типа SELLLIMIT                                                            |
//|  4 - ордера типа BUYSTOP      5 - ордера типа SELLSTOP                                                             |
//|  6 - ордера типа Balance     -1 - Все типы ордеров                                                                 |
//+--------------------------------------------------------------------------------------------------------------------+
int CountOrders( string symb= "" , int or_ty=- 1 ) 
  {
   int cnt= 0 ;
   if (symb== "0" ) symb= _Symbol ;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS)== true )
        {
         if (OrderSymbol()==symb || symb== "" )
           {
             if (or_ty< 0 || or_ty==OrderType()) cnt++;
           }
        }
     }
   return (cnt);
  }
//+----------------------------------------------------------------------------+
//| Модификация ордера                                                         |
//+----------------------------------------------------------------------------+
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//+----------------------------------------------------------------------------+
void ModifyOrder( string symb= "" , double sl= 0 , double tp= 0 )
  {
   if (symb== "0" ) symb= _Symbol ;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS)== true )
        {
         if (OrderSymbol()==symb || symb== "" )
           {
             if (OrderStopLoss()== 0 )
              {
               if (OrderType()==OP_BUY)
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-sl_price, OrderOpenPrice()+tp_price, OrderExpiration()))
                    { Print ( "Ордер модифицирован" );}
                   else
                    { Print ( "Ошибка модификации ордера:" , GetLastError ());}
                 }
               if (OrderType()==OP_SELL)
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+sl_price, OrderOpenPrice()-tp_price, OrderExpiration()))
                    { Print ( "Ордер модифицирован" );}
                   else
                    { Print ( "Ошибка модификации ордера:" , GetLastError ());}
                 }
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Возвращает пункты убытка последнего закрытого ордера в пунктах            |
//|  0 - последний ордер BUY                                                   |
//|  1 - последний ордер SELL                                                  |
//+----------------------------------------------------------------------------+
double GetPointLastLoss( int or_ty=- 1 )
  {
   datetime t= 0 ;
   double result= 0 ,p= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if ((OrderSymbol()== _Symbol ))
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime())
                 {t=OrderCloseTime(); p=OrderProfit(); or_ty=OrderType();
                   if (or_ty==OP_BUY&&p< 0 )
                    {
                     result=OrderOpenPrice()-OrderClosePrice();
                    } else {result= 0 ;}
                   if (or_ty==OP_SELL&&p< 0 )
                    {
                     result=OrderClosePrice()-OrderOpenPrice();
                    } else {result= 0 ;}
                 }
              }
           }
        }
     }
   return (result);
  }
//+------------------------------------------------------------------+

당신의 경우 마법은 전혀 필요하지 않습니다

 
MakarFX :

이와 같이

당신의 경우 마법은 전혀 필요하지 않습니다

감사합니다 테스트해보고 다시 알려드리겠습니다. 나는 그것이 나처럼 잘 작동하기를 희망하지만 새로운 테이크에 중지(작동했다면)를 추가합니다.

그리고 Input4의 외부 매개변수는 무엇입니까? 5; 6?

 
SGarnov :
감사합니다 테스트해보고 다시 알려드리겠습니다. 나는 그것이 나처럼 잘 작동하기를 희망하지만 새로운 테이크에 중지(작동했다면)를 추가합니다.

이것은 단지 수정일 뿐입니다. 주문 삭제 또는 취소가 없습니다.

조언자가 무엇을 해야 하는지 설명해주시면 제가 도와드리도록 하겠습니다.

 
SGarnov :

그리고 Input4의 외부 매개변수는 무엇입니까? 5; 6?

나는 삭제하는 것을 잊었다
 
MakarFX :

조언자가 무엇을 해야 하는지 설명해주시면 제가 도와드리도록 하겠습니다.

구매를 위해 보류 주문을 넣었습니다 - 어드바이저가 작동 중입니다 - 보류 주문이 트리거됩니다 - 어드바이저가 이것을 "보고" 이 미결 주문에 넣습니다.

손절매(외부 매개변수는 설정에서 설정됨);

이익을 취 하십시오 (외부 매개 변수는 계수를 통해 설정에서 설정됩니다 (예 : 1 ~ 2)).

손절매 수준에서 판매하기 위해 보류 중인 주문 .

가능한 시나리오.

옵션 1.

A) 가격이 테이크에 도달하면 어드바이저는 손절매와 매도 보류 주문을 제거합니다.

옵션 2.

B) 손절매가 트리거되고 "거래 내역으로 이동"한 경우:

판매 주문이 열렸고 EA가 이 주문에 대해 다음을 대체했습니다.

손절매 (외부 매개변수는 설정에서 설정됨);

이익을 얻음 + 기록에서 손절매를 촉발했습니다.

손절매 수준에서 구매하기 위해 보류 중인 주문.

가격이 테이크에 도달했습니다 - 어드바이저가 손절매와 매수 보류 주문을 제거합니다.

작업이 보류 중인 판매로 시작되는 경우 그 반대의 경우도 마찬가지입니다.

따라서 어드바이저는 외부 매개변수 "Number of Stop Loss"에 대한 작업을 중지할 때까지 작동합니다(제 경우에는 2입니다. 이는 옵션 2가 3번 반복되고 어드바이저가 향후 작업을 중지하고 모두 제거함을 의미합니다. 첫 번째 정류장은 가지 않습니다).

두 번째 변형에서는 한 정거장이 목표에 추가됩니다. 테이크에 도달하지 않고 두 번째 옵션이 반복되면 지정된 외부 매개변수 "스톱 로스 번호"에 따라 2개의 스톱이 테이크에 추가되는 식입니다.


내가 게시한 코드는 내가 설명한 문제를 제외하고 제대로 작동합니다(테이크에 추가해야 하는 기록에 1개 또는 2개의 정거장이 표시되지 않음).

이 같은.

 
SGarnov :

구매를 위해 보류 주문을 넣었습니다 - 어드바이저가 작동 중입니다 - 보류 주문이 트리거됩니다 - 어드바이저가 이것을 "보고" 이 미결 주문에 넣습니다.

손절매(외부 매개변수는 설정에서 설정됨);

이익을 취 하십시오 (외부 매개 변수는 계수를 통해 설정에서 설정됩니다 (예 : 1 ~ 2)).

손절매 수준에서 판매하기 위해 보류 중인 주문 .

가능한 시나리오.

옵션 1.

A) 가격이 테이크에 도달하면 어드바이저는 손절매와 매도 보류 주문을 제거합니다.

옵션 2.

B) 손절매가 트리거되고 "거래 내역으로 이동"한 경우:

판매 주문이 개설되었고 EA는 이 주문에 대해 다음을 대체했습니다.

손절매 (외부 매개변수는 설정에서 설정됨);

이익을 얻음 + 기록에서 손절매를 촉발했습니다.

손절매 수준에서 구매하기 위해 보류 중인 주문.

가격이 테이크에 도달했습니다 - 어드바이저가 손절매와 매수 보류 주문을 제거합니다.

작업이 보류 중인 판매로 시작되는 경우 그 반대의 경우도 마찬가지입니다.

따라서 어드바이저는 외부 매개변수 "Number of Stop Loss"에 대한 작업을 중지할 때까지 작동합니다(제 경우에는 2입니다. 이는 옵션 2가 3번 반복되고 어드바이저가 향후 작업을 중지하고 모두 제거함을 의미합니다. 첫 번째 정류장은 가지 않습니다).

두 번째 변형에서는 한 정거장이 목표에 추가됩니다. 테이크에 도달하지 않고 두 번째 옵션이 반복되면 지정된 외부 매개변수 "스톱 로스 번호"에 따라 2개의 스톱이 테이크에 추가되는 식입니다.


내가 게시한 코드는 내가 설명한 문제를 제외하고 제대로 작동합니다(테이크에 추가해야 하는 기록에 1개 또는 2개의 정거장이 표시되지 않음).

이 같은.

"손절매 수" - 연속 또는 현재 날짜?

 
MakarFX :

"손절매 수" - 연속 또는 현재 날짜?

통화 쌍에 대한 행의 중지 수입니다.

어드바이저는 여러 통화 쌍에 서 있고 여러 정거장이 내역을 입력하고 다른 순서로 내역을 이해하기 위해 어드바이저는 처음에 주문을 ID로 표시하지만 내역에서 찾지 못합니다. OrderMagikNumber()가 보일 것이라고 생각했습니다. 그들을 위해. 아마도 다른 통화 쌍에서 중지의 역사에서 고문이 "보는"것을 멈춘다는 사실 때문일 수 있습니까?나는 한 쌍에서 고문으로 일하려고하지 않았으며 그로부터 의미가 없을 것입니다.

소스를 다시 게시? 그가 수정해야 할 것은 "역사에서 스탑 트레이드를 검색하고 그를 새로 배치된 테이크에 추가하도록 하는 것"입니다.