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

 
Tretyakov Rostyslav # :
 // Параметры советника
input string   sParametersEA = "" ;     // Параметры советника
input double   Lot           = 0.01 ;   // Количество лотов
input double   Lotcontrol    = 0.08 ;   // -----  
input int      StopLoss      = 30 ;     // Стоп (SL)
input int      TakeProfit    = 30 ;     // Тейк (TP)
input int      HourPause     = 1 ;       // Пауза в часах
input int      Slippage      = 3 ;       // Проскальзование (в пунктах)
input int      Magic         = 1 ;       // Индентификатор советника
input double   K_Martin1     = 0.01 ;   // Множитель мартин 1
input double   K_Martin2     = 1.9 ;     // Множитель мартин 2
input double   K_Martin3     = 1.4 ;     // Множитель мартин 3
input int      OrdersClose   = 3 ;       // Ограничение лотности мартин1
input int      OrdersClose2  = 5 ;       // Ограничение лотности мартин2
input int      DigitsLot     = 2 ;       // Точность лотности
// Параметры индикатора
input string   sParametersMA = "" ;     // Параметры индикатора
input int      PeriodMA      = 14 ;     // Период мувинга
input int      MovingShift   = 1 ;       // Сдвиг мувинга
// Глобальные переменные
datetime Start= 0 ,newbar;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit ()
  {
Start          = TimeCurrent ();
MaxMartinLot   = Lot* MathPow ( 1.4 ,OrdersClose);
MaxMartinLot2  = Lot* MathPow (K_Martin2,OrdersClose2);
int Y          = 15 ;
DrawLABEL( "nextlot" , 1 , 5 ,Y, clrLime , "" ); 
Y += 20 ;
DrawLABEL( "currentlot" , 1 , 5 ,Y, clrLime , "" );
Y += 30 ;
return ( INIT_SUCCEEDED );
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.
// выключаем торговлю      
       if (OrderLots()>=Lotcontrol)
     {
      Start= TimeCurrent ()+(HourPause* 60 * 60 );
     }
// Если нет открытых ордеров, то входим в условие
       if ((CountOrders()== 0 )&& Start<= TimeCurrent ())
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
       if (bSignalBuy() == true )
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL( "nextlot" , 1 , 5 , 0 ,Color1(), StringConcatenate ( "CURRENT LOT: " ,DoubleToStr(LOT(), 2 )));
      DrawLABEL( "currentlot" , 1 , 5 , 0 ,Color2(), StringConcatenate ( "NEXT LOT: " ,DoubleToStr(LOT(), 2 ))); 
 
  }

일종의 수집이지만 테스터에서 한 번만 작동합니다.

한 번 더 테스트하면 단일 트랜잭션이 열리지 않습니다.

첫 번째 테스트 중에는 간격이 설정되지만 로트가 시작 로트로 재설정되면 더 이상 거래가 열리지 않습니다.

내가 어디 잘못갔어?

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

일종의 수집이지만 테스터에서 한 번만 작동합니다.

한 번 더 테스트하면 단일 트랜잭션이 열리지 않습니다.

첫 번째 테스트 중에는 간격이 설정되지만 로트가 시작 로트로 재설정되면 더 이상 거래가 열리지 않습니다.

내가 어디 잘못갔어?

종종 그 전에 f1을 누르고 기능을 클릭하고 다음을 읽으십시오.

OrderSelect() 함수를 사용하여 주문을 미리 선택해야 합니다.

이것은 OrderLots() 함수를 위한 것입니다.

술에 취해 죄송합니다.

새해 복 많이 받으세요!

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

일종의 수집이지만 테스터에서 한 번만 작동합니다.

한 번 더 테스트하면 - 단일 트랜잭션을 열지 않습니다.

첫 번째 테스트 중에는 간격이 설정되지만 로트가 시작 로트로 재설정되면 더 이상 거래가 열리지 않습니다.

내가 어디서 잘못했니?

선물

이 기능을 사용해 보세요:

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

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
        {
         if (OrderSymbol()==sy || sy== "" )
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (op< 0 || OrderType()==op)
                 {
                   if (mn< 0 || OrderMagicNumber()==mn)
                    {
                     l+=OrderLots();
                    }
                 }
              }
           }
        }
     }
   return (l);
  }
 
Alekseu Fedotov # :

선물

이 기능을 사용해 보세요:

감사합니다 새해 복 많이 받으세요)

 
Andrey Sokolov # :

네. 나는 가능한 한 간단하게 그것을 응용 프로그램에 연결하고 거기에서 작동합니다.

TestLib의 컨텍스트에서 mql5를 호출합니까? TestLib::TestClass::Inc()이어야 합니다.
 
законопослушный гражданин # :

감사합니다 새해 복 많이 받으세요)

그렇다면 연락하십시오!

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

일종의 수집이지만 테스터에서 한 번만 작동합니다.

내가 어디서 잘못했니?

디버거는 이러한 문제를 해결하는 데 매우 유용합니다. 나는 그것을 사용하는 것이 좋습니다

 
Vladimir Simakov # :
TestLib의 컨텍스트에서 mql5를 호출합니까? TestLib::TestClass::Inc()여야 합니다.

감사해요

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

일종의 수집이지만 테스터에서 한 번만 작동합니다.

내가 어디 잘못갔어?
 // Параметры советника
input string   sParametersEA = "" ;     // Параметры советника
input double   Lot           = 0.01 ;   // Количество лотов
input double   Lotcontrol    = 0.08 ;   // -----  
input int      StopLoss      = 30 ;     // Стоп (SL)
input int      TakeProfit    = 30 ;     // Тейк (TP)
input int      HourPause     = 1 ;       // Пауза в часах
input int      Slippage      = 3 ;       // Проскальзование (в пунктах)
input int      Magic         = 1 ;       // Индентификатор советника
input double   K_Martin1     = 0.01 ;   // Множитель мартин 1
input double   K_Martin2     = 1.9 ;     // Множитель мартин 2
input double   K_Martin3     = 1.4 ;     // Множитель мартин 3
input int      OrdersClose   = 3 ;       // Ограничение лотности мартин1
input int      OrdersClose2  = 5 ;       // Ограничение лотности мартин2
input int      DigitsLot     = 2 ;       // Точность лотности
// Параметры индикатора
input string   sParametersMA = "" ;     // Параметры индикатора
input int      PeriodMA      = 14 ;     // Период мувинга
input int      MovingShift   = 1 ;       // Сдвиг мувинга
// Глобальные переменные
datetime Start= 0 ,newbar;
double dMA;
double MaxMartinLot;
double MaxMartinLot2;
//+-----------------------------------------------------------------------------------------------+
int OnInit ()
  {
Start          = TimeCurrent ();
MaxMartinLot   = Lot* MathPow ( 1.4 ,OrdersClose);
MaxMartinLot2  = Lot* MathPow (K_Martin2,OrdersClose2);
int Y          = 15 ;
DrawLABEL( "nextlot" , 1 , 5 ,Y, clrLime , "" ); 
Y += 20 ;
DrawLABEL( "currentlot" , 1 , 5 ,Y, clrLime , "" );
Y += 30 ;
return ( INIT_SUCCEEDED );
  }
//+-----------------------------------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+-----------------------------------------------------------------------------------------------+
void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.
// выключаем торговлю      
   if ( GetInfoLastPos( 1 ) >=Lotcontrol)
     {
      Start= GetInfoLastPos( 3 ) +(HourPause* 60 * 60 );
     }
// Если нет открытых ордеров, то входим в условие
   if ((CountOrders()== 0 )&& Start<= TimeCurrent ())
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
       if (bSignalBuy() == true )
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL( "nextlot" , 1 , 5 , 0 ,Color1(), StringConcatenate ( "CURRENT LOT: " ,DoubleToStr(LOT(), 2 )));
      DrawLABEL( "currentlot" , 1 , 5 , 0 ,Color2(), StringConcatenate ( "NEXT LOT: " ,DoubleToStr(LOT(), 2 ))); 
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                                    |
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos( int a= 1 )
  {
   datetime t= 0 ;
   double result= 0 ,l= 0 ,p= 0 ,f= 0 ;
   int i=OrdersHistoryTotal()- 1 ;
   for ( int pos=i;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if (a== 1 ) {result=l;} else
   if (a== 2 ) {result=p;} else
   if (a== 3 ) {result=( double )t;}
   else      {result= 0 ;}
   return (result);
  }
 
Tretyakov Rostyslav # :

고맙습니다.

void를 통해 GetInfoLastPos()를 작성했습니다....