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

 
MakarFX # :

라이브러리는 일반적으로 작동합니까?

랩톱에는 32 비트가 있고 라이브러리는 64k에서 충돌하지 않습니다. 인터넷 어딘가에서이 케이스를 분해하는 방법에 대한 비디오를 보았지만 헤더 또는 무언가를 만들 때 무언가를 열어야합니다. 나는 64에서 코드를 재컴파일했고 우리는 간다. 글쎄, 64k에서 8바이트의 포인터가 이미 나쁘게 보이지 않는 것으로 밝혀졌습니다. 다른 중요한 차이점이 있을 수 있습니다. 이 문제를 열심히 해결해야 합니다. 저는 디버깅을 위해 32비트 컴파일러로 작업하고 싶습니다. 그리고 제 아이디어는 그것들을 위해 날카로워졌습니다.

 
왜 double 0.00134가 30으로 나누어 떨어지지 않는지 말해주세요.
그것은 정수로 밝혀지고 소수점 뒤에 무한 -e
약 0.00004가 있어야 합니다.
 
Ivan Butko # :
왜 double 0.00134가 30으로 나누어 떨어지지 않는지 말해주세요.
그것은 정수로 밝혀지고 소수점 뒤에 무한 -e
약 0.00004가 있어야 합니다.
 Print ( DoubleToString ( 0.00134 / 30 ) ); 0.00004467

 
Vitaly Muzichenko # :

Vitaliy, 인쇄하지 않으면 내부 계산에 0.00004... 또는 5.666666.....-e가 표시됩니까?
아니면 하나이고 같은 것입니까?
 
Ivan Butko # :
Vitaliy, 인쇄하지 않으면 내부 계산에 0.00004... 또는 5.666666.....-e가 표시됩니까?
아니면 하나이고 같은 것입니까?

이것은 내부 계산에 나타납니다(8바이트의 정수 16진수)

https://ru.wikipedia.org/wiki/Double_precision_number

0.00004467 = 0x3f076b81834d51ed
 
안녕하세요! MT4에서 투 거래소까지의 합리적인 거래 복제자를 아는 사람이 있습니까?
 

좋은 시간. 말하다


미결제 주문 확인이 없는 코드가 있습니다.

설정된 논리에 따라 주문을 열지만 주문을 열고 매수 및 매도

 void OnTick ()
{
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   Comment ( 
   "\n" ,                      name,
   "\n" , 
   "Символ " ,                 Symbol (),  
   "\n" ,
   "Тайм Фрейм " ,             Period (),
   "\n" ,                      AccountCompany(),
   "\n" ,
   " " ,                       AccountServer(),
   "\n" , 
   "Lots" ,                    Lot,
   "\n" ,
   "Объем в бай " ,             "BuyLots()" ,
   "\n" , 
   "Объем в сел " ,             "SellLots()" ,
   "\n" ,
   "Price " ,                  Bid,
   "\n" , 
   "Дата " ,                   TimeToString ( TimeCurrent (), TIME_DATE ),
   "\n" ,
   "Server Time " ,             TimeToString ( TimeCurrent (), TIME_SECONDS ),
   "\n" , 
   "\n" , "Процент просадки " , NormalizeDouble (  ( AccountInfoDouble ( ACCOUNT_BALANCE )- AccountInfoDouble ( ACCOUNT_MARGIN_FREE ))/ AccountInfoDouble ( ACCOUNT_BALANCE )* 100 , 
   2 ) /*, "\n" //"  CalcTP() ", CalcTP(),
,  "  t_p $ ", t_p, "  Profit() $ ", Profit(), "\n",  */ ); 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   /*if (CountTrades() == 0 && TypeOrder(OP_BUY) && TypeOrder(OP_SELL))
      {*/
       double body = Close[ 1 ] - Open[ 1 ];
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
//Открытие позиции Buy
     if (body > 0 )
       {
        Forder = ( OrderSend ( _Symbol ,OP_BUY,Lot,Ask,iSlippage, 0 , 0 , "Коммент" ,Magic, 0 ,Blue));
         if (Forder > 0 )
          {
           Print ( "Открыта Позиция BUY" );
           if ( OrderSelect (Forder, SELECT_BY_TICKET))
             {
              TP = NormalizeDouble ((Ask+iTakeProfit* _Point ), _Digits );
               if (OrderModify(OrderTicket(),OrderOpenPrice(), 0 ,TP, 0 ))
                 Print ( "Ордер Модифицирован BUY " ); 
               else 
                 Print ( "Ошибка Модификации Ордера BUY = " , GetLastError ());
             }
          } Print ( "Ошибка Открытия Позиции BUY" );
       }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
//Открытие позиции Sell      
     if (body < 0 )
       {
        Forder = ( OrderSend ( _Symbol ,OP_SELL,Lot,Bid,iSlippage, 0 , 0 , "Коммент Sell" ,Magic, 0 ,Red));
         if (Forder > 0 )
           {
             Print ( "Открыта Позиция SELL" );
             if ( OrderSelect (Forder, SELECT_BY_TICKET))
              {
               TP = NormalizeDouble ((Bid-iTakeProfit* _Point ), _Digits );
               if (OrderModify(OrderTicket(),OrderOpenPrice(), 0 ,TP, 0 ))
                   Print ( "Ордер Модифицирован SELL " ); 
               else 
                   Print ( "Ошибка Модификации Ордера SELL = " , GetLastError ());
              }
           } Print ( "Ошибка Открытия Позиции SELL" );
       }
     }  
 //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//      
   /* else 
   {
   
   }*/
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
/*}*/

이 주문에 대한 추가 작업이 계획되어 있습니다.

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


확인을 활성화하면 주문이 원하는 대로 열리지 않습니다.
카운터 오더가 무엇이든 첫 번째 오더의 오픈 여부를 확인하고 마지막 종류의 오더가 마감될 때까지 같은 종류의 주문을 오픈하고 다시 오픈 조건을 확인하는 로직으로 돌아가야 합니다.

 int TypeOrder( int OrType)
{
 int count = 0 ;
   for ( int i = OrdersTotal (); i>= 0 ; i++ )
     {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         {
           if (OrderSymbol() == _Symbol && OrderType() == OrType && OrderMagicNumber() == Magic)
             {
              count++;
             }
         }
     } return (count);
}

그리고 그것을 지적하는 방법에는 이해가 없습니다.
이해를 도와줄 사람이 있습니까?

힌트를 주셔서 감사합니다.

 
Alexander Avksentyev # :

좋은 시간.

 void OnTick ()
  {
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   Comment ( 
   "\n" ,                      name,
   "\n" , 
   "Символ " ,                 Symbol (),  
   "\n" ,
   "Тайм Фрейм " ,             Period (),
   "\n" ,                      AccountCompany(),
   "\n" ,
   " " ,                       AccountServer(),
   "\n" , 
   "Lots" ,                    Lot,
   "\n" ,
   "Объем в бай " ,             "BuyLots()" ,
   "\n" , 
   "Объем в сел " ,             "SellLots()" ,
   "\n" ,
   "Price " ,                  Bid,
   "\n" , 
   "Дата " ,                   TimeToString ( TimeCurrent (), TIME_DATE ),
   "\n" ,
   "Server Time " ,             TimeToString ( TimeCurrent (), TIME_SECONDS ),
   "\n" , 
   "\n" , "Процент просадки " , NormalizeDouble (  ( AccountInfoDouble ( ACCOUNT_BALANCE )- AccountInfoDouble ( ACCOUNT_MARGIN_FREE ))/ AccountInfoDouble ( ACCOUNT_BALANCE )* 100 , 
   2 ) /*, "\n" //"  CalcTP() ", CalcTP(), "  t_p $ ", t_p, "  Profit() $ ", Profit(), "\n",  */ ); 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   double body = Close[ 1 ] - Open[ 1 ];
   if (CountTrades() == 0 && body > 0 ) BuyOpen();     // Если нет открытых и сигнал бай
   if (CountTrades() == 0 && body < 0 ) SellOpen();     // Если нет открытых и сигнал селл
   if (CountTrades( 0 ) > 0 && body > 0 ) BuyOpen();     // Если есть открытые бай и сигнал бай
   if (CountTrades( 1 ) > 0 && body < 0 ) SellOpen();     // Если есть открытые селл и сигнал селл
  }  
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров по типу                                 |
//+------------------------------------------------------------------+
int CountTrades( int ot=- 1 ) 
  {
   int cnt= 0 ;
   int i= OrdersTotal ()- 1 ;
   for ( int pos=i;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS,MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol )
           {
             if (OrderMagicNumber()==MagicNum)
              {
               if (OrderType()==ot||ot==- 1 ) cnt++;
              }
           }
        }
     }
   return (cnt);
  }
//+------------------------------------------------------------------+
void BuyOpen() //Открытие позиции Buy
  {
   Forder = ( OrderSend ( _Symbol ,OP_BUY,Lot,Ask,iSlippage, 0 , 0 , "Коммент" ,Magic, 0 ,Blue));
   if (Forder > 0 )
     {
       Print ( "Открыта Позиция BUY" );
       if ( OrderSelect (Forder, SELECT_BY_TICKET))
        {
         TP = NormalizeDouble ((Ask+iTakeProfit* _Point ), _Digits );
         if (OrderModify(OrderTicket(),OrderOpenPrice(), 0 ,TP, 0 ))
             Print ( "Ордер Модифицирован BUY " ); 
         else 
             Print ( "Ошибка Модификации Ордера BUY = " , GetLastError ());
        }
     }
   else Print ( "Ошибка Открытия Позиции BUY" );
  }
//+------------------------------------------------------------------+
void SellOpen() //Открытие позиции Sell  
  {
   Forder = ( OrderSend ( _Symbol ,OP_SELL,Lot,Bid,iSlippage, 0 , 0 , "Коммент Sell" ,Magic, 0 ,Red));
   if (Forder > 0 )
     {
       Print ( "Открыта Позиция SELL" );
       if ( OrderSelect (Forder, SELECT_BY_TICKET))
        {
         TP = NormalizeDouble ((Bid-iTakeProfit* _Point ), _Digits );
         if (OrderModify(OrderTicket(),OrderOpenPrice(), 0 ,TP, 0 ))
             Print ( "Ордер Модифицирован SELL " ); 
         else 
             Print ( "Ошибка Модификации Ордера SELL = " , GetLastError ());
        }
     }
   else Print ( "Ошибка Открытия Позиции SELL" );
  }
//+------------------------------------------------------------------+
 
MakarFX # :

고맙습니다. 그 논리 비트는 정확합니다. 카운터만 정확하고 조건을 올바르게 지정하십시오.

 if (CountTrades() == 0 && body > 0 ) BuyOpen();     // Если нет открытых и сигнал бай
   if (CountTrades() == 0 && body < 0 ) SellOpen();     // Если нет открытых и сигнал селл
   if (CountTrades( 0 ) > 0 && body > 0 ) BuyOpen();     // Если есть открытые бай и сигнал бай
   if (CountTrades( 1 ) > 0 && body < 0 ) SellOpen();     // Если есть открытые селл и сигнал селл

고맙습니다. 나는 이것을 정리할 것이다.

 
Tretyakov Rostyslav # :

좋은 시간. 질문입니다. 트롤이 있다

 void Trail()
{
 if (iTrailStart <= 0.0 ) return ; 
 double tp,sl_lev;
 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 (iTrailTakeProfit > 0.0 )
                {
                tp=OrderTakeProfit() + NormalizeDouble (iTrailTakeProfit * Point (), _Digits );
                 if ( NormalizeDouble (((tp - OrderTakeProfit())) < 0.0 , Digits )) return ;
                tp = OrderTakeProfit();
                } else tp = 0.0 ;
               if (OrderProfit() + OrderSwap() + OrderCommission() > MarketInfo( Symbol (), MODE_TICKVALUE) * iTrailStart * OrderLots()) return ;
                {
                 if ( NormalizeDouble (Bid - OrderOpenPrice() <= iTrailStart * Point (), Digits )) return ;
                   {
                     if (OrderStopLoss()== 0.0 && NormalizeDouble ((Bid-OrderStopLoss()) <= iTrailDist * Point (), _Digits )) return ;
                      {
                       if (iTrailStep > 0.0 && OrderStopLoss()== 0.0 && NormalizeDouble ((Bid - OrderStopLoss() - iTrailDist * Point () < iTrailStep * Point ()), _Digits )) return ;
                        {
                         sl_lev = NormalizeDouble (Bid - iTrailDist * Point (), _Digits );
                         if ( NormalizeDouble ((Bid - sl_lev) < MarketInfo( Symbol (),MODE_STOPLEVEL) * Point , Digits )) return ;
                           {
                             if (!OrderModify(Forder,OrderOpenPrice(),OrderStopLoss() + iTrailStart * Point ,OrderTakeProfit(),OrderExpiration()))
                             Print ( "Не удалось модифицировать стоплосс ордера №" ,OrderTicket(), ". Ошибка: " , GetLastError ());
                           }
                        }
                      }
                   }
                }
             }
           if (OrderType() == OP_SELL)
             {
               if (iTrailTakeProfit > 0.0 )
                {
                 tp=OrderProfit() - NormalizeDouble (iTrailTakeProfit * Point (), _Digits );
                 if ( NormalizeDouble ((OrderTakeProfit() - tp) < 0.0 , _Digits )) return ;
                 tp = OrderTakeProfit();
                } else tp = 0.0 ;
               if (OrderProfit() + OrderSwap() + OrderCommission() > MarketInfo( Symbol (), MODE_TICKVALUE) * iTrailStart * OrderLots()) return ;
                {
                 if ( NormalizeDouble ((OrderProfit() - Ask) <= iTrailStart * Point (), _Digits )) return ;
                   {
                     if (OrderStopLoss() == 0.0 && NormalizeDouble ((OrderStopLoss() - Ask) <= iTrailDist * Point (), _Digits )) return ;
                      {
                       if (iTrailStep > 0.0 && OrderStopLoss() == 0.0 && NormalizeDouble ((OrderStopLoss() - Ask) - iTrailDist * Point (), _Digits ) < iTrailStep * Point ()) return ;
                         {
                          sl_lev = NormalizeDouble (Ask + iTrailDist * Point (), _Digits );
                           if ( NormalizeDouble ((sl_lev - Ask) > MarketInfo( Symbol (),MODE_STOPLEVEL) * Point , _Digits )) return ;
                            {
                             if (!OrderModify(Forder,OrderOpenPrice(),OrderStopLoss() + iTrailStart * Point ,OrderTakeProfit(),OrderExpiration()))
                             Print ( "Не удалось модифицировать стоплосс ордера №" ,OrderTicket(), ". Ошибка: " , GetLastError ());
}}}}}}}}}}

그가 벌게 될 것을 고문에게 말하는 방법.

 void OnTick ()
  {
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   Comment ( 
   "\n" ,                      name,
   "\n" , 
   " " ,                       Symbol (),  
   "\n" ,
   "Тайм Фрейм " ,             Period (),
   "\n" ,                      AccountCompany(),
   "\n" ,
   "\n " ,                     AccountServer(),
   "\n" , 
   "Lots\n" ,                  B_S_Lot(),
   "\n" ,
   "Price " ,                  Bid,
   "\n" , 
   "Дата " ,                   TimeToString ( TimeCurrent (), TIME_DATE ),
   "\n" ,
   "Server Time " ,             TimeToString ( TimeCurrent (), TIME_SECONDS ),
   "\n" , 
   "Profit " ,                 Profit(),
   "\n" ,
   "AvTP " ,                   CalcTP (),
   "\n" , 
   "Количество ордеров " ,     CountTrades(),
   "\n" ,
   "\n " ,                     GetVolumeLotLastOrder(),
   "\n" ,
   "\n" , "Процент просадки " , NormalizeDouble (  ( AccountInfoDouble ( ACCOUNT_BALANCE )- AccountInfoDouble ( ACCOUNT_MARGIN_FREE ))/ AccountInfoDouble ( ACCOUNT_BALANCE )* 100 , 2 )
  ); 
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx//
   double body = Close[ 1 ] - Open[ 1 ];
   if (CountTrades() == 0 && body > 0 ) BuyOpen();     // Если нет открытых и сигнал бай
   if (CountTrades() == 0 && body < 0 ) SellOpen();     // Если нет открытых и сигнал селл
   if (CountTrades( 0 ) > 0 && body > 0 ) BuyOpen();     // Если есть открытые бай и сигнал бай
   if (CountTrades( 1 ) > 0 && body < 0 ) SellOpen();     // Если есть открытые селл и сигнал селл
   Trail();
  }

나는 그것이 그렇게 표시되는 것을 보았지만 어떻게 든 그것은 나를 위해 작동하지 않습니다.

일반적으로 문제는 ex를 지정하는 것입니다. 함수가 작동하려면 어떻게 해야 할까요?