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() とする必要があります。
 
законопослушный гражданин #:

ありがとうございます!) 新年あけましておめでとうございます!)

いつでもOK!

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

揃えたつもりが、テスターで一度しか動作しない

どこで間違えたんだろう?

このような問題を解決するには、デバッガが適しています。使用することをお勧めします

 
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 #:

ありがとうございます。

getInfoLastPos()にvoidを使った のですが・・・。