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

 
Taras Slobodyanik # :

따라서 각 새 틱의 조건을 확인해야 합니다. 이전 틱에서 작동하지 않으면 새 틱에서 변경됩니다.

글쎄, 당신은 오류 처리를해야합니다.

어레이를 통해 수행하는 경우 나머지 모두와 함께 작성된 수정 주문의 티켓만 확인하십시오.

MakarFX # :
네, 감사합니다. 이 경우 개체로 저장하면 티켓 대신 고유 마법이 더 낫습니다. 그렇지 않으면 같은 이름을 가진 수십 개의 개체가 생성됩니다.

 StringToInteger ( ObjectName ( 0 ,i, 0 )
오식? 두 함수 모두 하나의 매개변수만 사용할 수 있는 것 같습니다.
[삭제]  
Документация по MQL5: Графические объекты / ObjectName
Документация по MQL5: Графические объекты / ObjectName
  • www.mql5.com
ObjectName - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nerd Trader # :
어레이를 통해 수행하는 경우 나머지 모두와 함께 작성된 수정 주문의 티켓만 확인하십시오.

네, 감사합니다. 이 경우 개체로 저장하면 티켓 대신 고유한 마법이 더 낫습니다. 그렇지 않으면 동일한 이름을 가진 수십 개의 개체가 생성 됩니다.

오식? 두 함수 모두 하나의 매개변수만 사용할 수 있는 것 같습니다.

번식하지 마십시오

 if ( ObjectName (i)!=OrderTicket()) ObjectDelete ( 0 , ObjectName (i));

죄송합니다

 StringToInteger ( ObjectName (i));
 
MakarFX # :

번식하지 마십시오

죄송합니다

그런데 다음과 같은 오류가 주기적으로 발생하는 이유를 알고 계십니까? 성공적으로 열린 주문 100개의 경우 약 10개가 있습니다.

 2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: 4051 | order.sl_price: 2.813499706815862e-262
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: OrderSend error 4051
2021.10.10 16:18:09.853	2021.01.05 21:15:00  test EURUSD,M5: unknown trade cmd 406958564 for OrderSend function

order.sl_price: 2.813499706815862e-262 - 손절매 가격, 분명히 이 숫자는 안됩니다.
4051 - "잘못된 기능 매개변수 값"
unknown trade cmd는 주문 유형입니까? 이것도 문제가 안됩니다.

 class Order{
   public :
     double open_price;
     double sl_price;
     double tp_price;
     color   arrow_color;
     string error_text;
     int cmd;

    Order(){};

     void InitForSell( string type = "" ){
       if (type == "" ){
         Print ( "Ошибка: 'type' должен иметь значение" );
         return ;
      }

       sl_price = NormalizeDouble (db_last.hight + (sl_indent* Point ), Digits ); // (цена + (кол-во пипсов* Point )


      arrow_color = clrRed ;

       if (type == "sellstop" ){
        open_price = NormalizeDouble (db_last.low - (order_indent* Point ), Digits );

         if (tp_size != 0 )
          tp_price = NormalizeDouble (db_last.low - (order_indent+tp_size)* Point , Digits );
         else
          tp_price = 0 ;

        cmd = OP_SELLSTOP;
        error_text = "Ошибка открытия селстопа " ;
      }

       if (type == "sell" ){
        open_price = Bid;

         if (tp_size != 0 )
          tp_price = NormalizeDouble (Bid - tp_size* Point , Digits );
         else
          tp_price = 0 ;

        cmd = OP_SELL;
        error_text = "Ошибка открытия села " ;
      }
    };

     void InitForBuy( string type = "" ){
       if (type == "" ){
         Print ( "Ошибка: 'type' должен иметь значение" );
         return ;
      }

       sl_price = NormalizeDouble (db_last.low - (sl_indent* Point ), Digits ); // (цена + (кол-во пипсов* Point )


      arrow_color = clrGreen ;

       if (type == "buystop" ){
        open_price = NormalizeDouble (db_last.hight + (order_indent* Point ), Digits );

         if (tp_size != 0 )
          tp_price = NormalizeDouble (db_last.hight + (order_indent+tp_size)* Point , Digits );
         else
          tp_price = 0 ;

        cmd = OP_BUYSTOP;
        error_text = "Ошибка открытия байстопа " ;
      }

       if (type == "buy" ){
        open_price = Ask;

         if (tp_size != 0 )
          tp_price = NormalizeDouble (Bid + tp_size* Point , Digits );
         else
          tp_price = 0 ;

        cmd = OP_BUY;
        error_text = "Ошибка открытия бая " ;
      }
    };

    ~Order(){};
};

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

if (...)
  {
     ResetLastError ();
     int order_send = OrderSend ( Symbol (), order.cmd, 0.01 , order.open_price, 1 , 
    order.sl_price, order.tp_price, "" , 0 , 0 , order.arrow_color);

     if (order_send == - 1 ) return ;
  }
 
MakarFX # :
티켓 또는 가격에 대해 "최소 및 최대"를 의미합니까?

티켓으로

 
Nerd Trader # :

그런데 다음과 같은 오류가 주기적으로 발생하는 이유를 알고 계십니까? 성공적으로 열린 주문 100개의 경우 약 10개가 있습니다.

order.sl_price: 2.813499706815862e-262 - 손절매 가격, 분명히 이 숫자는 안됩니다.
4051 - "잘못된 기능 매개변수 값"
unknown trade cmd는 주문 유형입니까? 이것도 문제가 안됩니다.

"NormalizeDouble"을 움직여 보십시오.

 if (...)
  {
     ResetLastError ();
     int order_send = OrderSend ( Symbol (), order.cmd, 0.01 , NormalizeDouble (order.open_price, Digits ), 1 , 
     NormalizeDouble (order.sl_price, Digits ), NormalizeDouble (order.tp_price, Digits ), "" , 0 , 0 , order.arrow_color);

     if (order_send == - 1 ) return ;
  }

 
EVGENII SHELIPOV # :

티켓으로

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double p;
   int     i, k= OrdersTotal (), pr= 0 ;

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op)) {
         if (mn< 0 || OrderMagicNumber()==mn) {
           if (OrderTicket()== GetTicketMaxMinOrder( 0 ) || OrderTicket()== GetTicketMaxMinOrder( 1 ) ) {
             p=MarketInfo(OrderSymbol(), MODE_POINT);
             if (p== 0 ) if ( StringFind (OrderSymbol(), "JPY" )< 0 ) p= 0.0001 ; else p= 0.01 ;
             if (OrderType()==OP_BUY) {
               pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
             }
             if (OrderType()==OP_SELL) {
               pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
            }
           }
        }
      }
    }
  }
   return (pr);
}
 
MakarFX # :

"NormalizeDouble"을 움직여 보십시오.

변경 없이

 
MakarFX # :

Makar는 통화 수익과 포인트 수익을 비교하기 위해 지금까지 어드바이저에 코드를 삽입했습니다. 내가 이해하는 한, 이는 이러한 함수의 값이 0일 때 이해할 수 있습니다.