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

 
natawik :

안녕하세요 여러분, 도와주세요!

이런 문제가 있습니다. 나는 mql5에서 vps를 구입했고 모든 것이 잘 작동하고 전문가를 직접 설치하고 8개의 차트를 설정하고 전문가를 설치했습니다. 그리고 모든 것이 VPS로 옮겨졌습니다.

그리고 내 것이 아니었기 때문에 컴퓨터에서 메타트레이더 프로그램을 제거해야 했습니다.

이제 컴퓨터에서 로그인할 때

모든 것이 작동합니다, 전문가. 작동하지만 설정을 조정할 수 없습니다. 내 컴퓨터에서 관리할 수 있도록 Expert Advisor와 차트를 다시 가져오려면 어떻게 해야 합니까?

고맙습니다!

이 경우 프로필을 저장해야 합니다. 나중에 VPS에서 다운로드하려면.

 

보고서의 모든 데이터를 왜곡 없이 Excel로 내보내는 방법을 누가 압니까?

복사만 하면 "이익" 열의 데이터 일부가 날짜로 내보내집니다(예: 1.94 대신 1월 94).

아무리 구하려고 해도 이 문제에서 벗어날 수 없습니다.

 
законопослушный гражданин :

보고서의 모든 데이터를 왜곡 없이 Excel로 내보내는 방법을 누가 압니까?

복사만 하면 "이익" 열의 데이터 일부가 날짜로 내보내집니다(예: 1.94 대신 1월 94).

아무리 구하려고 해도 이 문제에서 벗어날 수 없습니다.

업로드하기 전 또는 업로드된 파일을 열기 전에 Excel에서 소수점 구분 기호를 점으로 바꿉니다.

 
законопослушный гражданин :

보고서의 모든 데이터를 왜곡 없이 Excel로 내보내는 방법을 누가 압니까?

복사만 하면 "이익" 열의 데이터 일부가 날짜로 내보내집니다(예: 1.94 대신 1월 94).

아무리 구하려고 해도 이 문제에서 벗어날 수 없습니다.

그래서

 
SGarnov :

작업한 정류장 수를 고려해야 할 수도 있습니다. 예를 들어, 고문 은 기록에서 스톱을 찾을 것이고, 그 중 2개가 있는 경우 3개와 4개를 모두 추가해야 하며, 모두 외부 설정 "스톱 로스 수"에 따라 다릅니다.

귀하의 경우뿐만 아니라 대부분의 경우 마감된 주문을 열거하여 거래 내역에 액세스하는 대신 열린 주문의 티켓을 배열로 보관하는 것이 가장 좋습니다. 이 배열을 주기적으로 정렬하여 이 주문이 간단한 조건으로 마감되었는지 확인하십시오.

 if (OrderCloseTime() != 0 ) // значит ордер закрылся…

주문이 마감된 경우 티켓으로 선택하여 수익으로 마감되었는지 확인할 수 있습니다. 즉시 입구에서 정류장까지의 거리를 확인하고 엄마가 허락하는 한 이 거리를 더하십시오.

그리고 이러한 모든 조작 후에 배열 크기를 0으로 재설정하고 루프에서 배열 크기를 늘리고 현재 열려 있는 주문의 티켓으로 다시 채웁니다.

 
Vladislav Andruschenko :

이 경우 프로필을 저장해야 합니다. 나중에 VPS에서 다운로드하려면.

그리고 내가 vps를 끄고 모든 것을 다시 설정하고 vps를 다시 켜고 모든 차트와 전문가를 귀하에게 전송하면
같은 장소에서 그 오래된 데이터는 당신에게 있지 않습니까?
 

여보세요

코드 이해를 도와주세요

클래스가 있고 모든 것이 잘 작동하는 코드 조각을 첨부했습니다.

클래스의 일부 기능을 나만의 별도 기능으로 연결하고 오류를 작성하고 싶습니다.

예시

 void OpenHandPosition( int tp)
   {
       string lot= 0.01
       bool response = actionTrade.ManageOrderSend(tp, lt, 0 , 0 , 0 , 0 , 0 ); //
   }

그것이 작동 방식입니다

그리고 이것은 더 이상

 void OpenHandPosition( int tp)
   {

     int stopLoss   = GetStopLossPoints(size);
     int takeProfit = GetTakeProfitPoints();
     bool response = actionTrade.ManageOrderSend(tp, lt , stopLoss, takeProfit, 0 , 0 , 0 );

   }

모든 것이 이 기능에서 작동합니다.

 void StrategyTrader::DoEntryTrade(TradeDirection tradeDir)

하지만 이것은 그렇지 않다

OpenHandPosition( int tp)

돕다

파일:
test.mq5  21 kb
 
SGarnov :

구현하기 어렵다는 결론에 도달했습니다. 귀하의 코드는 훨씬 간단하고 명확하며 논리적이지만 ..... 웬일인지 추가되지 않습니다. 중요한 것은 포기하지 않는 것입니다.

모든 규칙이 보입니다. 물어보세요...

 //+------------------------------------------------------------------+
//|                                                 SGarnov.v2.1.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   = 200 ;   // Уровень Stop Loss
input double    O_Lots   = 0.01 ;   // Лоты
input int       SL_Count = 2 ;     // Количество убыточных ордеров
input int       Slippage = 30 ;     // Проскальзывание
input int       N_Magic  = 888 ;   // Magic

datetime T_Start;
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)
  {
//--- 
   Comment ( "" );
//--- 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   t_profit = S_Loss*T_Profit * Point ();
   tp_price = NormalizeDouble (t_profit+GetPointLoss(), Digits );
//---
   s_loss   = MathMax (S_Loss, MarketInfo( _Symbol , MODE_STOPLEVEL)) * Point ();
   sl_price = NormalizeDouble (s_loss, Digits );
//---
   // Удаляем отложенный ордер после профита
   if (CountOrders(- 1 )== 1 ) DeletePending();
//---
   // Проверяем серию убыточных ордеров
   if (CountOrders(- 1 )== 1 &&GetLossOrders()<SL_Count)
     {
       // Устанавливаем отложенный ордер
      SendPending();
     }
//---
   // Проверяем наличие ордеров
   if (CountOrders(- 1 )> 0 )
     {
       // Устанавливаем StopLoss/TakeProfit
      ModifyOrder();
     }
//---
   int a=( int )TimeStart();
   int b=GetLossOrders();
   int c=( int )((GetPointLoss()+t_profit)/ Point );
   
   Comment ( "Время начала цикли: " ,TimeToStr(a, TIME_SECONDS ), "\n" ,
           "Серия StopLoss ордеров: " ,b, "\n" ,
           "Размер TakeProfita: " ,c);
  }
//+------------------------------------------------------------------+
//| Модификация ордера                                               |
//+------------------------------------------------------------------+
void ModifyOrder()
  {
   double op= 0 ;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS)== true )
        {
         if (OrderSymbol()== _Symbol )
           {
             if (OrderStopLoss()== 0 )
              {
               if (OrderType()==OP_BUY)
                 {op=OrderOpenPrice();
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), op-sl_price, op+tp_price, OrderExpiration()))
                    { Print ( "Ордер модифицирован" );}
                   else
                    { Print ( "Ошибка модификации ордера:" , GetLastError ());}
                 }
               if (OrderType()==OP_SELL)
                 {op=OrderOpenPrice();
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), op+sl_price, op-tp_price, OrderExpiration()))
                    { Print ( "Ордер модифицирован" );}
                   else
                    { Print ( "Ошибка модификации ордера:" , GetLastError ());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
//|  0 - ордера типа BUY          1 - ордера типа SELL               |
//|  2 - ордера типа BUYLIMIT     3 - ордера типа SELLLIMIT          |
//|  4 - ордера типа BUYSTOP      5 - ордера типа SELLSTOP           |
//|  6 - ордера типа Balance     -1 - Все типы ордеров               |
//+------------------------------------------------------------------+
int CountOrders( int or_ty=- 1 ) 
  {
   int cnt= 0 ;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS)== true )
        {
         if (OrderSymbol()== _Symbol )
           {
             if (or_ty< 0 || or_ty==OrderType()) cnt++;
           }
        }
     }
   return (cnt);
  }
//+------------------------------------------------------------------+
//| Установка отложенного ордера                                     |
//+------------------------------------------------------------------+
void SendPending()
  {
   double op= 0 ;
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS)== true )
        {
         if (OrderSymbol()== _Symbol )
           {
             if (OrderType()==OP_BUY)
              {
               if (OrderStopLoss() != 0 )
                 {
                  op=OrderStopLoss();
                   if ( OrderSend ( _Symbol ,OP_SELLSTOP,O_Lots,op,Slippage, 0 , 0 , NULL ,N_Magic))
                    { Print ( "Отложенный ордер установлен" );}
                   else
                    { Print ( "Ошибка установки отложеного одера: " , GetLastError ());}
                 }
              }
             if (OrderType()==OP_SELL)
              {
               if (OrderStopLoss() != 0 )
                 {
                  op=OrderStopLoss();
                   if ( OrderSend ( _Symbol ,OP_BUYSTOP,O_Lots,op,Slippage, 0 , 0 , NULL ,N_Magic))
                    { Print ( "Отложенный ордер установлен" );}
                   else
                    { Print ( "Ошибка установки отложеного одера: " , GetLastError ());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|  Возвращает пункты убытка закрытых ордеров с начала цикла        |
//+------------------------------------------------------------------+
double GetPointLoss()
  {
   double result= 0 ,b= 0 ,s= 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 (OrderProfit()< 0 )
                 {
                   if (OrderCloseTime()>=TimeStart())
                    {
                     if (OrderType()==OP_BUY)
                       {
                        b+=OrderOpenPrice()-OrderClosePrice();
                       }
                     if (OrderType()==OP_SELL)
                       {
                        s+=OrderClosePrice()-OrderOpenPrice();
                       }
                    }
                 }
              }
           }
        }
     }
   return (b+s);
  }
//+------------------------------------------------------------------+
//| Удаление отложенного ордера                                      |
//+------------------------------------------------------------------+
void DeletePending()
  {
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS)== true )
        {
         if (OrderSymbol()== _Symbol )
           {
             if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
              {
               if (OrderMagicNumber() == N_Magic)
                 {
                   if (OrderDelete(OrderTicket()))
                    { Print ( "Отложенный ордер удален" );}
                   else
                    { Print ( "Ошибка удаления отложеного одера: " , GetLastError ());}
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Возвращает время начала цикла                                    |
//+------------------------------------------------------------------+
datetime TimeStart()
  {
   datetime ts1= 0 ,ts2= 0 ;
   if ( OrdersTotal ()!= 0 )
     {
       for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--)
        {
         if ( OrderSelect (i, SELECT_BY_POS))
           {
             if (OrderMagicNumber()!=N_Magic)
              {
               if (OrderType()==OP_BUY || OrderType()==OP_SELL)
                 {
                   if (OrderSymbol()== _Symbol )
                    {
                     if (ts1<OrderOpenTime())
                       {
                        ts1=OrderOpenTime();
                       }
                    }
                 }
              }
           }
        }
       for ( int pos= 0 ; pos<OrdersHistoryTotal(); pos++)
        {
         if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
           {
             if (OrderMagicNumber()!=N_Magic)
              {
               if (OrderType()==OP_BUY || OrderType()==OP_SELL)
                 {
                   if (OrderSymbol()== _Symbol )
                    {
                     if (ts2<OrderOpenTime())
                       {
                        ts2=OrderOpenTime();
                       }
                    }
                 }
              }
           }
        }
     }
   return ( MathMax (ts1,ts2));
  }
//+------------------------------------------------------------------+
//|  Возвращает кол-во серии убыточных ордеров                       |
//+------------------------------------------------------------------+
int GetLossOrders()
  {
   int cnt= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if ((OrderSymbol()== _Symbol ))
           {
             if (OrderCloseTime()>=TimeStart())
              {
               if (OrderProfit()< 0 ) cnt++;
              }
           }
        }
     }
   return (cnt);
  }
//+------------------------------------------------------------------+
 
MakarFX :

모든 규칙이 보입니다. 물어보세요...

도움을 주셔서 감사합니다. 다음 주에만 고문의 올바른 작업을 작성할 수 있습니다. 오늘은 금요일이고 시장 진입 가격을 찾고 있지 않습니다.

 
natawik :
그리고 내가 vps를 끄고 모든 것을 다시 설정하고 vps를 다시 켜고 모든 차트와 전문가를 귀하에게 전송하면
같은 장소에서 그 오래된 데이터는 당신에게 있지 않습니까?
그런 문제가 자주 발생해서 컴퓨터, 터미널 설정하고 다 옮기고, 계속 옮기고, 그래픽 바꾸다 등등 하다가 헉, 뭔가 바꿔야 겠다.... 다 해봐야 겠습니다. 다시.