[ARCHIVE!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 4. - 페이지 361

 
veti-k :

아니요, 이것은 이미 너무 많습니다. 최소 20-50핍에서 변동성이 더 큰 것은 무엇입니까?
USD/JPY
 

얘들아, 말해봐

통화 쌍에 대한 MT4 전달에 포함된 표준 지표에 대한 고문을 테스트할 때 질문이 없습니다. 모든 것이 거래 알고리즘에 따라 작동합니다.

금속에 대한 테스트: 은, 금 - 주문이 열리지 않으며 테스터의 "저널"에 0으로 나눕니다.

에. 매개변수가 동일하면 이 5자리 DC(Forex4)의 기록이 테스트된 기기에 대해 업로드됩니다.

가능한 이유는 무엇입니까? 텔레파시로 보내지 마세요. Expert Advisor는 교과서 버전 에 따라 제가 직접 작성했습니다.

 
Roman. :

얘들아, 말해봐

통화 쌍에 대한 MT4 전달에 포함된 표준 지표에 대한 고문을 테스트할 때 질문이 없습니다. 모든 것이 거래 알고리즘에 따라 작동합니다.

금속에 대한 테스트: 은, 금 - 주문이 열리지 않으며 테스터의 "저널"에 0으로 나눕니다.

에. 매개변수가 동일하면 이 5자리 DC(Forex4)의 기록이 테스트된 기기에 대해 업로드됩니다.

가능한 이유는 무엇입니까? 텔레파시로 보내지 마세요. Expert Advisor는 교과서 버전 에 따라 제가 직접 작성했습니다.

변수로 나누기의 경우 먼저 0인지 여부를 확인해야 합니다.
 
Roman. :

얘들아, 말해봐

통화 쌍에 대한 MT4 전달에 포함된 표준 지표에 대한 고문을 테스트할 때 질문이 없습니다. 모든 것이 거래 알고리즘에 따라 작동합니다.

금속에 대한 테스트: 은, 금 - 주문이 열리지 않으며 테스터의 "저널"에 0으로 나눕니다.

에. 매개변수가 동일하면 이 5자리 DC(Forex4)의 기록이 테스트된 기기에 대해 업로드됩니다.

가능한 이유는 무엇입니까? 텔레파시로 보내지 마세요. Expert Advisor는 교과서 버전 에 따라 제가 직접 작성했습니다.


그래서 코드를 봅니다. 일반적으로 (메모장 ++ 프로그램에서) 코드에서 나눗셈 기호가 발생하는 모든 위치를 자동으로 표시하고 어떤 경우에는 실제로 0으로 나누기가 발생하는지 확인할 수 있습니다.
 
drknn :

그래서 코드를 봅니다. 일반적으로 메모장 ++ 프로그램에서 코드에서 나눗셈 기호가 발생하는 모든 위치를 자동으로 표시하고 어떤 경우에는 실제로 0으로 나누기가 발생하는지 확인할 수 있습니다.


예, 나는 이미 모든 것을 인쇄물로 오버레이하여 인쇄물이 도달 한 곳, 모든 것이 순서대로 정렬되어 있음을 의미합니다 ...

금속에 대한 부피 정규화 함수(0으로 나누기)에 이 오류가 있었습니다. 지금은 존재하지 않습니다. 다른 131개가 나타났습니다 - 잘못된 부피 , 명시적으로 = 0.01 lot로 설정되었지만 일반적으로 ...

통화의 경우 이 볼륨 정규화 기능이 제대로 작동합니다. .... 아마도 공통된 기능이 있습니까(금속 및 통화의 경우)?

 //--------------------------------------------------------------------
// Lot_MM.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot_MM()                             // Позовательская ф-ия
  {
   int time, ticket;                   // Наибольшее время открытия и номер ордера
   double orderLots;                   // Lots   
   double orderProfit;                 // Profit
   double Price;                       // Цена открытия рыночного ордера
   double SL;                         // Значение StopLoss ордера
   double   TP;                         // Значение TakeProfit ордера
   string Symb   = Symbol ();                     // Финансовый инструм.
   double One_Lot= MarketInfo (Symb,MODE_MARGINREQUIRED); //Размер свободных средств, необходимых для открытия 1 лота
   double Min_Lot= MarketInfo (Symb,MODE_MINLOT); // Мин. размер. лотов
   double Max_Lot = MarketInfo ( Symbol (),MODE_MAXLOT);
   double Step   = MarketInfo (Symb,MODE_LOTSTEP); //Шаг изменен размера
   double Free   = AccountFreeMargin ();         // Свободные средства
   double LotVal = MarketInfo ( Symbol (),MODE_TICKVALUE); //стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots> 0 )                                 // Лоты заданы явно..
{                                               // ..проверим это
       double Money=Lots*One_Lot;               // Стоимость открываемого ордера   
       if (Money<= AccountFreeMargin ())             // Средств хватает..     
         {  
          Lots_New=Lots;                           // ..принимаем заданное
             // else                                     // Если не хватает..
             // Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов 
             Print ( "Функция Lot_MM: Lots_New  = " , Lots_New);    
...
...
...
...
 // ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...            
                    Lots_New = NormalizeLots(Lots_New);  
   return (true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots( double lot)
{
   double lotStep = MarketInfo ( Symbol (), MODE_LOTSTEP);
   double lots = NormalizeDouble (lot / lotStep, 0 ) * lotStep;   
   lots = MathMax (lots, MarketInfo ( Symbol (), MODE_MINLOT));
   lots = MathMin (lots, MarketInfo ( Symbol (), MODE_MAXLOT));   
   return (lots);
}
 

이해할 수 없습니다. 맨 윗줄이 인쇄되지만 실수로 주문이 열리지 않습니다. 131번 - 볼륨이 정확하지 않습니다. 이미 0.1과 0.01을 모두 명시적으로 설정했습니다...

 Print ( "Функция открытия ордера с рынка - продажа: Teeth = " ,   NormalizeDouble (Teeth, Digits ), " upfractal = " , upfractal, " Цена Bid = " , NormalizeDouble (Bid, Digits ), " Lots_New = " , NormalizeDouble (Lots_New, 2 ));                
Ticket= OrderSend ( Symbol (), 1 , 0.01 ,Bid, 50 , 0 , 0 , "Antiunity-start" ,Magic, 0 , Red );    

 
Techno :
변수로 나누기의 경우 먼저 0인지 여부를 확인해야 합니다.

감사합니다. 명심하겠습니다. 이번에는 기성품의 볼륨 정규화 기능을 가져왔을 뿐입니다.
 

쓸모없는 동안 ... 같은 오류를 작성합니다 ...

 Print ( "Функция открытия ордера с рынка - продажа: Teeth = " ,   NormalizeDouble (Teeth, Digits ), " upfractal = " , upfractal, " Цена Bid = " , NormalizeDouble (Bid, Digits ), " Lots_New = " , NormalizeDouble (Lots_New, 2 ));                
          Ticket= OrderSend ( Symbol (), 1 ,Lots_New,Bid, 50 , 0 , 0 , "Antiunity-start" ,Magic, 0 , Red );            
           Print ( "Функция открытия ордера с рынка - продажа: старт" );      

테스터 10,000의 계정에서 금과 0.01 및 0.1 및 1 로트에 대한 위치를 열었습니다. 쓸모가 없습니다.

누군가 비슷한 문제에 직면했을 수 있습니까? 제발 내게 말해줘...

 

사용자 정의 루틴에 내 로트 확인 기능을 추가하십시오. 그리고 모든 OrderSend() 전에 호출하십시오. 내 dll에서 반올림은 수학 법칙에 따라 수행됩니다. 반올림할 숫자가 숫자 >=5인 소수 부분 에서 끝나면 반올림됩니다. 따라서 <=4는 반올림됩니다. 내가 이해하는 한 프로그래밍 언어에는 어떤 이유로 인해 문제가 있습니다. 내 자신의 dll을 조각해야 했습니다. 일반적으로 코드는 매우 간단하지만 한 번에 최적의 솔루션을 찾기 전에 인터넷을 많이 뒤졌습니다. dll 소스가 필요합니까?

 // ============ ProverkaLota() =====================================================================
// функция принимает нормализует лот ордера
//-----------------------------------------------------
double ProverkaLota( double LotOrdera, string SMB){
   double SMB_MinLot= MarketInfo (SMB,MODE_MINLOT);
  double SMB_MaxLot= MarketInfo (SMB,MODE_MAXLOT);
   double SMB_LotStep= MarketInfo (SMB,MODE_LOTSTEP);
  LotOrdera=OkruglenieDoSotykh(LotOrdera); // округляем до сотых

 if (SMB_LotStep== 0.1 ){ // округляем до десятых
   LotOrdera/= 10 ;
   LotOrdera=OkruglenieDoSotykh(LotOrdera);
   LotOrdera*= 10 ; // возвращаем дробную часть ордера на место
 }
  if (LotOrdera<SMB_MinLot){
   LotOrdera=SMB_MinLot;
 }
  if (LotOrdera>SMB_MaxLot){
   LotOrdera=SMB_MaxLot;
 }
  return (LotOrdera);
}
// =================================================================================================
파일:
basic_dll_1.zip  190 kb
 
drknn :

사용자 정의 루틴에 내 로트 확인 기능을 추가하십시오. 그리고 모든 OrderSend() 전에 호출하십시오. 내 dll에서 반올림은 수학 법칙에 따라 수행됩니다. 반올림할 숫자가 숫자 >=5인 소수 부분에서 끝나면 반올림됩니다. 따라서 <=4는 반올림됩니다. 내가 이해하는 한 프로그래밍 언어에는 어떤 이유로 인해 문제가 있습니다. 내 자신의 dll을 조각해야 했습니다. 일반적으로 코드는 매우 간단하지만 한 번에 최적의 솔루션을 찾기 전에 인터넷을 많이 뒤졌습니다. dll 소스가 필요합니까?


네. 고맙습니다.