MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 44

 
trader781:
#property strict


//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
extern double Lots=0.01; //Oбьем открываемого ордера
extern double Martin=2;
extern int    Step=200;
extern int    TakeProfit=250;

extern const string Настройки_работы_советника="";

int Period1=6;//Период 1МА
ENUM_APPLIED_PRICE PRICE1=PRICE_MEDIAN;             // 1МА По цене

int Period2=50;//Период 2МА
ENUM_APPLIED_PRICE PRICE2=PRICE_MEDIAN;             // 2МА По цене

int Period3=800;//Период 3МА
ENUM_APPLIED_PRICE PRICE3=PRICE_MEDIAN;             // 3МА По цене

int Period4=25;//Период 4МА
ENUM_APPLIED_PRICE PRICE4=PRICE_MEDIAN;             // 4МА По цене, вспомогательная

uint  X=20;                                                // отклонение от ма, пунктов
int   i;                                                   // исходный счетчик ордеров
bool  dummy;                                               // для выхода функций в переменную
int   ticket;                                            // тикет открываемого ордера
int   Magic=444;                                           // Magic Number
int   lastlot,tp;
double price;
int    count;
int    otype;



int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
void OnTick()
  {
     {
      if(Bars<801) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         return;
     }
//+----------------------------------------------------------------Сборник параметров индикаторов

   double ma1=NormalizeDouble(iMA(NULL,0,Period1,0,MODE_SMA,PRICE1,1),5);  //+----6

   double ma2=NormalizeDouble(iMA(NULL,0,Period2,0,MODE_SMA,PRICE2,1),5);  //+----50

   double ma3=NormalizeDouble(iMA(NULL,0,Period3,0,MODE_SMA,PRICE3,1),5);  //+----800

   double ma31=NormalizeDouble(iMA(NULL,0,Period3,0,MODE_SMA,PRICE3,10),5);   //+----800
   double ma32=NormalizeDouble(iMA(NULL,0,Period3,0,MODE_SMA,PRICE3,20),5);  //+----800
   double ma33=NormalizeDouble(iMA(NULL,0,Period3,0,MODE_SMA,PRICE3,30),5);  //+----800

   double ma4=NormalizeDouble(iMA(NULL,0,Period4,0,MODE_SMA,PRICE4,0),5);  //+----25
//+-----------------------------------------------------------------  Открытие ордеров по 25-50 ма

//+-------------------------------------------------- открыть ордер

   if(Counts()==0)               //+-------------если количество ордеров равно 0
     {
      if((MathAbs(ma2-ma4)>30*_Point)
         && (MathAbs(Bid-ma3)>100*Point())
         && (ma31>ma32>ma33)) //+-----покупка по 6+50
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,"",Magic,0,clrAzure);//+-------------отправка 1 ордера
        }
      if((MathAbs(ma2-ma3)>30*_Point))//+-------------условие продажи
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,"",Magic,0,clrAzure);//+-------------отправка 1 ордера
        }
        if (ticket==0)
            {
            return;
            }
     }
    
      else      //+------------если уже есть
    
        {
         if(FindLastOType()==OP_BUY)
           {
          
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())
              {
               ticket=OrderSend(Symbol(),OP_BUY,(FindLastLot()*Martin),Ask,0,0,0,"",Magic,0,clrAzure);
               ModifyOrders();
               myOrdersCloseTotal();
              }
           }

         if(FindLastOType()==OP_SELL)
           {
          
            if(Bid>=FindLastOrderOpenPrice()+Step*Point())
              {
               ticket=OrderSend(Symbol(),OP_SELL,(FindLastLot()*Martin),Bid,0,0,0,"",Magic,0,clrAzure);
               ModifyOrders();
               myOrdersCloseTotal();
              }
           }
        }
     }
  
//+-------------------------------------------------------------количество ордеров в рынке

int Counts()
  {
   count=0;
   for(i=OrdersTotal()-1; i>=0; i--) //   цикл будет работать пока не останется ордеров
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic))
        {
         if((OrderType()==OP_BUY || OrderType()==OP_SELL) && (OrderTicket()==ticket))
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------найти тип последнего ордера
int FindLastOType()
  {
   for(i=OrdersTotal()-1; i>=0; i--) //   цикл будет работать пока не останется ордеров
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic))
        {
         if((OrderType()==OP_BUY || OrderType()==OP_SELL) && (OrderTicket()==ticket))
            return(OrderType());
        }
     }
   return(-1);
  }
//+--------------------------------------------------------------вернуть цену последнего открытого ордера

double FindLastOrderOpenPrice()

  {
   int    oldticket;
   ticket=0;
   double oldorderopenprice=0;
   for(i=OrdersTotal()-1; i>=0; i--) //   цикл будет работать пока не останется ордеров
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic) && (OrderType()<2))
        {

         oldticket=OrderTicket();
         if(oldticket>ticket)
           {
            ticket=oldticket;
            oldorderopenprice=OrderOpenPrice();
           }
        }

     }
   return(oldorderopenprice);
  }
//+--------------------------------------------------------------вернуть объем последнего ордера
double FindLastLot()
  {
   int oldticket;
   ticket=0;
   double oldlots=0;
   for(i=OrdersTotal()-1; i>=0; i--) //   цикл будет работать пока не останется ордеров
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic)
      && (OrderType()==OP_BUY || OrderType()==OP_SELL))
        {
         oldticket=OrderTicket();
         if(oldticket>ticket)
           {
            ticket=oldticket;
            oldlots=OrderLots();
           }

        }

     }
   return(oldlots);
  }
  //+---------------------------------------------------------закрыть все если хоть один из серии закрылся
  
  int myOrdersCloseTotal()


  {
  int myOrderS=0;
   for(i=OrdersTotal()-1; i>0; i--)
     {
      if(((OrderSelect(i,SELECT_BY_POS,MODE_TRADES))==true) && OrderSymbol()==Symbol() && (OrderType()<2))
        {
         myOrderS=OrdersTotal();
        }
        else
        dummy=(OrderClose(OrderTicket(),OrderLots(),Bid,0,White));
     }

   return (myOrderS);
  }

  
  
  
//+------------------------------------------------модификация существующих расчет тейка по средней цене
void ModifyOrders()
  {
   bool   z=true;
   double avg_price=0;
   price=0;
   double orderlots=0;
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
      && (OrderMagicNumber()==Magic) && (FindLastOType()==OP_BUY))
        {
         price=(OrderOpenPrice()*OrderLots());
         orderlots=FindLastLot();
         avg_price=NormalizeDouble(price/orderlots,Digits);
         tp=(avg_price+TakeProfit*Point()); //+------------------------------------тут деление на 0 второго ордера
         z=OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0);
         if (!z)
         Print("Ошибка функции модифицирования");
        }
     }

   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
      && (OrderMagicNumber()==Magic) &&(FindLastOType()==OP_SELL))
       {
         price=(OrderOpenPrice()*OrderLots());
         orderlots=FindLastLot();
         avg_price=NormalizeDouble(price/orderlots,Digits);
         tp=(avg_price-TakeProfit*Point());   //+------------------------------------тут деление на 0 второго ордера
         z=OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0);
         if (!z)
         Print("Ошибка функции модифицирования");
       }
  
  
     }
    

  }







/*    
      
*/

//+------------------------------------------------------------------+

そこ、よくできました。

そして、今度はコンパイラが悪態をついている行です。

 
trader781:

この社会で押しつけがましいようですが、計算の0がどこから来るのか、誰も説明してくれませんね?

ポスト413

タイプ変換によるデータ損失の可能性 count.mq4 231 12

type conversionによるデータ損失の可能性 count.mq4 246 12

TPとLotは整数変数に書き込んではいけないということが理解できないのでしょうか?なぜそうなのか?
 
Vitalie Postolache:
TAやロットは整数変数に書き込んではいけないということが理解できないのでしょうか?なぜ、そのようなことになるのでしょうか。


そのようなことを正しく書くにはどうしたらいいのか、見えてくるのでしょうか。

 
Artyom Trishkin:
もう一度言いますが、H1上のインジケーターに昨日は何が表示されていたのか、それとも今この瞬間にH1上のインジケーターで何が起きているのかを知りたいのでしょうか?

インジケーターの値は、最初のクローズドバーH1で欲しい。

 
trader781:


このように、きちんと記録する方法を見ることができるのでしょうか。

初級編。
int   lastlot,tp;
double   lastlot,tp;
 
trader781:


このように、きちんと記録する方法を見ることができるのでしょうか。

double tp;
変数tpがdouble型 であることを宣言する。
 
Vitalie Postolache:
.
アレクセウ・フェドトフ

ありがとうございます!エラーは消えました。しかし、ボットはまだ起動時にターミナルと一緒に死んでしまいますが、明らかな理由はありません。

TestGenerator: unmatched data error (volume limit 262 at 2016.12.02 12:45 exceeded).

TestGenerator: unmatched data error (2016.10.13 10:05 の高値 1.10131 は最下位のタイムフレームから到達していない、高値 1.10123 はミスマッチ)

 
trader781:

ありがとうございます、エラーはなくなりました。しかし、botは起動時にターミナルと一緒に死んでしまいますが、明確な理由はありません。

TestGenerator: unmatched data error (volume limit 262 at 2016.12.02 12:45 exceeded).

TestGenerator: unmatched data error (2016.10.13 10:05 の高値 1.10131 は最下位のタイムフレームから到達していない、高値 1.10123 はミスマッチ)

死んでいる」のはbotではなく、ストーリーなんです。英語は辞書くらいは勉強しておきましょう。
 
Vitalie Postolache:
ボットが「死ぬ」のではなく、ストーリーが「死ぬ」のです。英語は辞書くらいは勉強しておきましょう。

しかも一気に噴煙を上げて......クソみたいな話?偶然の一致?

 
trader781:

しかも一気に噴煙を上げて......クソみたいな話?偶然の一致?

何が大変なんだ?いつもそうなんです。