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

 
makssub # :

예를 들어 EurUsd와 같은 동일한 통화 쌍 내에서 모두 처리하십시오. 둘 다 Buy에서 열려 있습니다.

일반적으로 이들은 서로 다른 쌍과 하나에서 서로 다른 작업입니다. 하나는 동일한 로트에서 2개의 주문/포지션에 교차하지 않고 교차하지 않는 다른 방향의 옵션이 있습니다. 두 가지 모두에 대해 겹치지 않는 손실 사이의 가격, 주문 간에만 이익이 교차하는 경우. 높을수록 낮을수록 주문까지의 거리에 따라 손실 또는 이익이 됩니다. 한쪽 방향은 이익, 다른 쪽 방향은 손실, 높을수록 이익 또는 손실 모두 낮습니다.

당신의 소원에 따라. 거래량이 같으면 같은 거래량을 닫고 동일하지 않으면 이익 금액, 손실 금액을 계산하고 이익 대 손실 비율을 계산하고 이 비율에 곱해야 합니다. 무익한 포지션의 랏의 번호를 닫고 이 부분을 닫습니다.

 
Ivan Butko 새 초가 시작되었을 때만 프로그램이 작동하도록 하고 코드를 실행한 후 몸을 낮추고 다음 초가 시작될 때까지 기다리는 방법을 알려주세요.

기능

   bool NewBar()
   {
       static datetime LastTime = 0 ;
       if ( iTime ( Symbol (), PERIOD_CURRENT , 0 ) != LastTime)
      {
         LastTime = iTime ( Symbol (), PERIOD_CURRENT , 0 );
         return ( true );
      }
       else
         return ( false );
   }
 
Valeriy Yastremskiy # :

일반적으로 이들은 서로 다른 쌍과 하나에서 서로 다른 작업입니다. 하나는 동일한 로트에서 2개의 주문/위치에 교차하지 않고 교차하지 않는 다른 방향의 옵션이 있습니다. 두 가지 모두에 대해 겹치지 않는 손실 사이의 가격, 주문 간에만 이익이 교차하는 경우. 높을수록 낮을수록 주문까지의 거리에 따라 손실 또는 이익이 됩니다. 한쪽 방향은 이익, 다른 쪽 방향은 손실, 높을수록 이익 또는 손실 모두 낮습니다.

당신의 소원에 따라. 거래량이 같으면 같은 거래량을 닫고 동일하지 않으면 이익 금액, 손실 금액을 계산하고 이익 대 손실 비율을 계산하고 이 비율에 곱해야 합니다. 무익한 포지션의 랏의 번호를 닫고 이 부분을 닫습니다.

그렇군요, 제가 원하는 바로 그겁니다. 수익성이 없는 부분을 계산하고 마감합니다.
예가 있습니까?
동안 시도했지만 혼란스러워서 작동하지 않았습니다.

 
Valeriy Yastremskiy # :

사샤소닉 # :

기능

매우 감사합니다!
 
makssub # :

그렇군요, 제가 원하는 바로 그겁니다. 수익성이 없는 부분을 계산하고 마감합니다.
예가 있습니까?
동안 시도했지만 혼란스러워서 작동하지 않았습니다.

예를 들어 내가 틀리지 않았다면 이러한 기능은 한 방향, 즉 매수 또는 매도만 겹칩니다. 한마디로 끝내야 합니다.




//=========================================================================================================================================//
//  Функция расчета текущего состояния по открытым ордерам                                                                                 //
//=========================================================================================================================================//

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CurrentCondition(string OrdType, string inf)
{
   int    Pos   = 0;
   double result = 0, Count = 0, AveragePrice = 0, profit = 0;
   double LastPriceBuy, LastPriceSell, ProfitBuy, ProfitSell, SumProfit;
   for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck()))
         {
            if(OrderType() == OP_SELL || OrderType() == OP_BUY)
            {
               if(inf == "Lpos")
               {
                  profit = OrderProfit()              ;
                  Pos    = OrderTicket()              ;

                  if(profit > 0 && profit > Lprofit)
                  {
                     Lprofit1 = Lprofit                  ;
                     Lpos1    = Lpos                     ;
                     Lprofit  = profit                   ; //макс значение
                     Lpos     = Pos                      ;
                  }

                  if(profit < 0 && profit < Cprofit)
                  {
                     Cprofit = profit                    ; //мин  значение
                     Cpos    = Pos                       ;
                  }
               }

               SumProfit += OrderProfit() + OrderSwap() + OrderCommission() ;
               if(inf == "CurrentDrawdown")
                  result = MathMax((AccountBalance() + AccountCredit() - AccountEquity()) / (AccountBalance() + AccountCredit()) * 100, 0);
               if(inf == "CurrentUrov" && AccountMargin() > 0)
                  result = AccountEquity() / AccountMargin() * 100        ;
               if(inf == "TotalOrd")
                  result++                ;

               if(OrdType == "Buy")
               {
                  if(OrderType() == OP_BUY)
                  {
                     if(inf == "TotalBuy")
                        result++                         ;
                     if(inf == "LastLotBuy")
                        result  = OrderLots()            ;
                     if(inf == "SumLotBuy")
                        result += OrderLots()            ;
                     AveragePrice += OrderOpenPrice() * OrderLots()            ;
                     Count        += OrderLots()                              ;
                     LastPriceBuy  = OrderOpenPrice()                         ;
                     ProfitBuy += OrderProfit() + OrderSwap() + OrderCommission() ;
                     if(AveragePrice > 0 && Count > 0)
                     {
                        if(inf == "CalculateAveragePriceBuy")
                           return(NormalizeDouble(AveragePrice / Count, Digits));
                     }
                     else
                        return(0);
                  }
               }

               if(OrdType == "Sell")
               {
                  if(OrderType() == OP_SELL)
                  {
                     if(inf == "TotalSell")
                        result++                        ;
                     if(inf == "LastLotSell")
                        result  = OrderLots()           ;
                     if(inf == "SumLotSell")
                        result += OrderLots()           ;
                     AveragePrice  += OrderOpenPrice() * OrderLots()           ;
                     Count         += OrderLots()                             ;
                     LastPriceSell  = OrderOpenPrice()                        ;
                     ProfitSell += OrderProfit() + OrderSwap() + OrderCommission();
                     if(AveragePrice > 0 && Count > 0)
                     {
                        if(inf == "CalculateAveragePriceSell")
                           return(NormalizeDouble(AveragePrice / Count, Digits));
                     }
                     else
                        return(0);
                  }
               }
            }
         }
      }
   }

   if(inf == "Lpos")
      return(Lpos)                                    ;  //Ордер с наибольшим профитом
   if(inf == "Cpos")
      return(Cpos)                                    ;  //Ордер с наименьшим профитом
   if(inf == "LastPriceBuy")
      return(NormalizeDouble(LastPriceBuy, Digits))  ;
   if(inf == "LastPriceSell")
      return(NormalizeDouble(LastPriceSell, Digits))  ;
   if(inf == "ProfitBuy")
      return(NormalizeDouble(ProfitBuy,      2))  ;
   if(inf == "ProfitSell")
      return(NormalizeDouble(ProfitSell,      2))  ;
   if(inf == "SumProfit")
      return(NormalizeDouble(SumProfit,      2))  ;
   return(result)                                                             ;
}

//=========================================================================================================================================//
//   Перекрытие ордеров                                                                                                                    //
//=========================================================================================================================================//

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CheckOverlapping()
{
   Lpos = 0;
   Cpos = 0;
   Lprofit = 0;
   Cprofit = 0;

   Lpos = CurrentCondition("", "Lpos");
   Cpos = CurrentCondition("", "Cpos");

   if(totalord >= LeadingOrder)
   {
      if(Lprofit > 0 && Lprofit1 <= 0 && Cprofit < 0)
      {
         if(Lprofit + Cprofit > 0 && (Lprofit + Cprofit) * 100 / Lprofit > ProfitPersent)
         {
            Lpos1 = 0;
            CloseSelectOrder();
         }
      }
      else

         if(Lprofit > 0 && Lprofit1 > 0 && totalord > LeadingOrder && Cprofit < 0)
         {
            if(Lprofit + Lprofit1 + Cprofit > 0 && (Lprofit + Lprofit1 + Cprofit) * 100 / (Lprofit + Lprofit1) > SecondProfitPersent)
               CloseSelectOrder();
         }
   }
}

//=========================================================================================================================================//
//  Перекрытие ордеров                                                                                                                     //
//=========================================================================================================================================//

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CloseSelectOrder()
{
   if(Info)
      Print("Функция перекрытия ордеров.");
   int error =  0;
   int error1 = 0;
   int error2 = 0;
   int Result = 0;
   int Slippage = 2 * MarketInfo(Symbol(), MODE_SPREAD);

//                       ---------------------- последний  -----------------------

   while(error1 == 0)
   {
      RefreshRates();
      int i = OrderSelect(Lpos, SELECT_BY_TICKET, MODE_TRADES);
      if(i != 1)
      {
         Print("Ошибка! Невозможно выбрать ордер с наибольшим профитом. Выполнение перекрытия отменено.");
         return (0);
      }
      if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck()))
      {
         if(OrderType() == OP_BUY)
         {
            error1 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue));
            if(error1 == 1)
            {
               if(Info)
                  Print("Лидирующий ордер закрыт успешно.");
               Sleep(500);
            }
            else
            {
               Print("Ошибка закрытия лидирующего ордера, повторяем операцию. ");
            }
         }

         //                        -----------------------------------------------------

         if(OrderType() == OP_SELL)
         {
            error1 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red));
            if(error1 == 1)
            {
               if(Info)
                  Print("Лидирующий ордер закрыт успешно");
               Sleep(500);
            }
            else
            {
               Print("Ошибка закрытия лидирующего ордера, повторяем операцию. ");
            }
         }
      }
   }

//                       ---------------------- пред последний  -----------------------

   if(Lpos1 != 0)
   {
      while(error2 == 0)
      {
         RefreshRates();
         i = OrderSelect(Lpos1, SELECT_BY_TICKET, MODE_TRADES);
         if(i != 1)
         {
            Print("Ошибка! Невозможно выбрать пред ордер с наибольшим профитом. Выполнение перекрытия отменено.");
            return (0);
         }
         if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck()))
         {
            if(OrderType() == OP_BUY)
            {
               error2 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue));
               if(error2 == 1)
               {
                  if(Info)
                     Print("Пред Лидирующий ордер закрыт успешно.");
                  Sleep(500);
               }
               else
               {
                  Print("Ошибка закрытия пред лидирующего ордера, повторяем операцию. ");
               }
            }
            //                        -----------------------------------------------------
            if(OrderType() == OP_SELL)
            {
               error2 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red));
               if(error2 == 1)
               {
                  if(Info)
                     Print("Пред Лидирующий ордер закрыт успешно");
                  Sleep(500);
               }
               else
               {
                  Print("Ошибка закрытия Пред лидирующего ордера, повторяем операцию. ");
               }
            }
         }
      }
   }

//                      ----------- выбранный (обычно с наименьшим профитом ) -----------

   while(error == 0)
   {
      RefreshRates();
      i = OrderSelect(Cpos, SELECT_BY_TICKET, MODE_TRADES);
      if(i != 1)
      {
         Print("Ошибка! Невозможно выбрать ордер с наименьшим профитом. Выполнение перекрытия отменено.");
         return (0);
      }
      if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck()))
      {
         if(OrderType() == OP_BUY)
         {
            error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue));
            if(error == 1)
            {
               if(Info)
                  Print("Перекрываемый ордер закрыт успешно.");
               Sleep(500);
            }
            else
            {
               Print("Ошибка закрытия перекрываемого ордера, повторяем операцию. ");
            }
         }

         //                             --------------------------------------------------

         if(OrderType() == OP_SELL)
         {
            error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red));
            if(error == 1)
            {
               if(Info)
                  Print("Перекрываемый ордер закрыт успешно.");
               Sleep(500);
            }
            else
            {
               Print("Ошибка закрытия перекрываемого ордера, повторяем операцию. ");
            }
         }
      }
   }

   Result = 1;
   return (Result);
}

 
makssub # :

그렇군요, 제가 원하는 바로 그겁니다. 수익성이 없는 부분을 계산하고 마감합니다.
예가 있습니까?
동안 시도했지만 혼란스러워서 작동하지 않았습니다.

왜 Vile이 이해합니까? 작동하지 않는 것은 무엇입니까? 코드가 필요합니다. 나는 단지 그런 문제가 없었습니다. 솔직히 저는 이 접근 방식이 자금 관리에 합리적이지 않다고 생각합니다.

 
MT5에서 동일한 입력을 가진 2개의 동일한 표시기가 하나의 창에 로드되도록 하는 방법을 알려주세요. 시작할 때마다 INDICATOR_SHORTNAME을 변경하려고 했지만 소용이 없었습니다. 아마도 다른 방법이 있습니까?
 
Aleksandr Kononov # :
MT5에서 동일한 입력을 가진 2개의 동일한 표시기가 하나의 창에 로드되도록 하는 방법을 알려주세요. 시작할 때마다 INDICATOR_SHORTNAME을 변경하려고 시도했지만 도움이 되지 않습니다. 아마도 다른 방법이 있습니까?

다른 쓸모없는 입력을 가져와 변경하십시오.

 
Valeriy Yastremskiy # :

왜 Vile이 이해합니까? 작동하지 않는 것은 무엇입니까? 코드가 필요합니다. 나는 그런 문제가 없었습니다. 솔직히 이 접근 방식은 자금 관리에 합리적이지 않다고 생각합니다.

좋은 오후에요. 나는 Vile에 대해 읽었습니다. 더하거나 뺄 수 없습니다.
돈 관리에 관해서는 아무 말도 할 수 없습니다. 시도하지 않았다.
최신 개정판을 첨부합니다. 그러나 거기에서 나는 이미 나 자신을 위해 모든 것을 혼란 시켰습니다)
Order1(2) 선택한 주문의 이익
선택한 주문의 Order1(3) 로트

 double FirstProfit( int a = 1 )
{
   double   profit = 0 , proflot = 0 ,
           OneProfLot = 0 , result = 1 , profit_1 = 0 ;
           
      OneProfLot = NormalizeDouble (Lots*Order1( 2 )/Order1( 3 ), 2 );
      profit = NormalizeDouble (Lots*Order1( 2 )/Order1( 3 ), 2 );
      proflot = Order1( 3 );
       while (profit >= Order1( 2 ) && profit <= OneProfLot)
         {
            profit -= OneProfLot;
             if (profit != 0 && NormalizeDouble (profit + CalculateProfitHistory(), 2 ) > NormalizeDouble (ProfitLot, Digits )*Lots* 100 ) 
            profit_1 = profit;
            proflot = NormalizeDouble (proflot*profit/Order1( 2 ), 2 );
 
         }
      }
   }
   if (a== 1 ) {result = ( double )profit_1;} else
   if (a== 2 ) {result = ( double )proflot;}  
   return (result);
}
 
Alexey Viktorov # :

다른 쓸모없는 입력을 가져와 변경하십시오.

수동 개입 없이는 어떻습니까? MT4에는 표시기가 하나씩 쌓여 있는데 그 이유를 모르겠습니다. 나는 MT5에서도 그것을 하고 싶습니다. 그리고 일반적으로 그것이 무엇에 의존하는지 이해하고 싶습니다.