初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 90

 
toni_starkExpert Advisorが 1年半前に動作していたが、今はチャートに表示されない。

運動=生、休息=死というテーゼ。ログには何と書かれているのでしょうか?

もし自分が持っていたら、点検して直しますよ.

 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

初心者の方からの質問 MQL4 MT4 MetaTrader 4

イリヤ・プロズメントフ, 2017.06.11 13:53

配列を操作するためのクラステンプレートがあります。
#property strict
#include <ObjectVariables.mqh>
#include <Arrays\varQSort.mqh>
#include <Arrays\objQSort.mqh>

template<typename T1>
class ArrayList
{
   private:
      T1 array[];
      QuickSorts<T1> *qs;
      int size;
      int index;

   public:
      //прочие функции
      void QuickSort();//отсортировать массив
      //прочие функции
};
//+------------------------------------------------------------------+
//| Сортировка массива
template<typename T1>
void ArrayList::QuickSort()
{
   int idx = index;//сохранение положения индекса
   if(IsPointer(array[0])) // true - массив содержит указатели класса
      qs /*ошибка 2*/ = new ObjQSort<T1>();
   else
      qs /*ошибка 2*/ = new VarQSort<T1>();
   qs.Sort(array, 0, index);
   index = idx;
}

このテンプレートクラスでは、配列が複雑なデータ型を 格納できることを考慮し、ソートを実装する必要があります。例えば、こんな感じです。
ArrayList<PP*> *dde; // PP - класс

単純な型と複雑な型に別々の関数を書くことはできるのですが、コンパイラは関数がデータ型によって厳密に区切られていることを理解できず、悪態をつき続けています。
'<' - 不正な操作 use ArrayList.mqh

そこで、インターフェイスを埋め込むことにしたのです。

#property strict
template <typename T1>
interface QuickSorts
{
   void Sort(T1 &array[], int beg, int end);
};
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class VarQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end);
   VarQSort(){}
   ~VarQSort(){}
};
template <typename T1>
void VarQSort::Sort(T1 &array[], int beg,int end)
{
   //алгоритм функции
}
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class ObjQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end){}
   ObjQSort(){}
   ~ObjQSort(){}
};

コンストラクトの全パートをコンパイルします。しかし、それを宣言しようとすると
ArrayList<PP*> *dde; // PP - класс
で、そのファイルをコンパイルすると、以下のようなエラーになります。

'クイックソート' - テンプレート不一致 varQSort.mqh /*error 1*/
'=' - 型の不一致 ArrayList.mqh /*error 2*/


この型の不一致を解消するには、コードのどこを修正すればよいのでしょうか?そもそも、なぜそれが発生したのかがわからない。

追伸
'<' - 不正な操作 varQSort.mqh を使用します。
この構成でも私を悩ませているのです。私が解消したかったのは、まさにこのエラーなのです。でも、このエラーはわかるけど、この2つはわからない。
template <typename T1>
class VarQSort : public QuickSorts<T1>
//....

template <typename T1>
class ObjQSort : public QuickSorts<T1>
//....
 
fxsaber:
確かに) 不一致のエラーは消え、それと共にもう一つのエラーも消えました。ありがとうございます。
 
フォーラムメンバーの皆さん、こんにちは!私は、機能にいくつかの変更を加えるのを手伝って欲しいのです。
enum _EventYesNo{
      YES            = 1,           //ДА
      NO             = 2            //НЕТ
      };
enum howmuch {one = 1,              //Одна
              two = 2,              //Две
              three = 3             //Три
              };

input    _EventYesNo    monday                     = 2;                 //торгуем в ПОНЕДЕЛЬНИК?
input    howmuch        mondayHM                   = 1;                 //Сколько сделок?
input    string         monday_open1               = "00:00";           //
input    string         monday_open2               = "00:00";           //
input    string         monday_open3               = "00:00";           //

input    _EventYesNo    tuesday                    = 2;                 //торгуем во ВТОРНИК?
input    howmuch        tuesdayHM                  = 1;                 //Сколько сделок?
input    string         tuesday_open1              = "00:00";           //
input    string         tuesday_open2              = "00:00";           //
input    string         tuesday_open3              = "00:00";           //

input    _EventYesNo    wednesday                  = 2;                 //торгуем в СРЕДУ?
input    howmuch        wednesdayHM                = 1;                 //Сколько сделок?
input    string         wednesday_open1            = "00:00";           //
input    string         wednesday_open2            = "00:00";           //
input    string         wednesday_open3            = "00:00";           //

input    _EventYesNo    thursday                   = 2;                 //торгуем в ЧЕТВЕРГ?
input    howmuch        thursdayHM                 = 1;                 //Сколько сделок?
input    string         thursday_open1             = "00:00";           //
input    string         thursday_open2             = "00:00";           //
input    string         thursday_open3             = "00:00";           //

input    _EventYesNo    friday                     = 2;                 //торгуем в ПЯТНИЦУ?
input    howmuch        fridayHM                   = 1;                 //Сколько сделок?
input    string         friday_open1               = "00:00";           //
input    string         friday_open2               = "00:00";           //
input    string         friday_open3               = "00:00";           //

extern int         minutes = 5;          // Время торговли(минут) bool    HOUR = true;                     // Часы Вкл (true) / Выкл (folse) //Отправляет true если по времени разрешено торговать bool isTradeTimeString() { datetime servertime = TimeCurrent(); datetime localtime = TimeLocal(); datetime time = 0; datetime hbegin = 0; datetime hend = 0; string TimeBegin = "00:00"; if(DayOfWeek() == 1){if(monday == 1){TimeBegin = monday_open1;}else{return(false);}} if(DayOfWeek() == 2){if(tuesday == 1){TimeBegin = tuesday_open1;}else{return(false);}} if(DayOfWeek() == 3){if(wednesday == 1){TimeBegin = wednesday_open1;}else{return(false);}} if(DayOfWeek() == 4){if(thursday == 1){TimeBegin = thursday_open1;}else{return(false);}} if(DayOfWeek() == 5){if(friday == 1){TimeBegin = friday_open1;}else{return(false);}} string TimeEnd = TimeToString(StrToTime(TimeBegin)+(60*minutes),TIME_MINUTES); if(servertime > localtime) {   time = servertime - localtime;   hbegin = StrToTime(TimeBegin) + time;   hend = StrToTime(TimeEnd) + time; } if(servertime < localtime) {   time = localtime - servertime;   hbegin = StrToTime(TimeBegin) - time;   hend = StrToTime(TimeEnd) - time; } if(localtime == servertime) {   hbegin = StrToTime(TimeBegin);   hend = StrToTime(TimeEnd); } datetime dtBegin, dtEnd;        // Время начала и окончания работы int      hc, he;                // Часы текущего времени и окончания работы dtBegin=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hbegin,TIME_MINUTES)); dtEnd=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hend,TIME_MINUTES)); hc = TimeHour(TimeCurrent()); he = TimeHour(dtEnd); if(dtBegin>=dtEnd) {   if(hc>=he)    dtEnd+=24*60*60;   else    dtBegin-=24*60*60; } if(HOUR==true) {   if(TimeCurrent()>=dtBegin && TimeCurrent()<=dtEnd)    return(true);   else   {    if(CountTrades()==0)     return(false);   } } return(true); }

例えば月曜日に、2つまたは3つの取引を開く必要がある場合、関数は時間を比較してパイプを送信しますが、私はこれまでに比較した1つの時間を持っています。


	          
 
見積書のエクスポートでは、どの日付のものからダウンロードするかを選択することができます。

なぜなら、「ダウンロード」ボタンを押すと、6,000 000件の名言がダウンロードされるからです。 名言データでハードディスクをいっぱいにして、ダウンロードされるまで長時間待ち、名言表から不要なデータを削除したい人はそういないはずです。

 

ハローディア.BUY 注文で指定したトレイリングストップコードが 正しく機能する理由を教えてください ...

       if (OrderType()==OP_BUY && (Bid-8*D*Point)>OrderStopLoss()&&(Bid-8*D*Point)>OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Bid-7*Point,Digits),NormalizeDouble(OrderOpenPrice()+25*D*Point,Digits),0,0);}

......しかし、売り 注文のための同じものは、SLを 設定しません... ...

       if (OrderType()==OP_SELL &&(Ask+8*D*Point)<OrderStopLoss()&&(Ask+8*D*Point)<OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+7*Point,Digits),NormalizeDouble(OrderOpenPrice()-25*D*Point,Digits),0,0);}

...原因は(Ask+8*D*Point)<OrderStopLoss() という条件にあると思われ これを外せばSLは 設定されますが、 Trailing Stopは 条件を指定しないと正しく動作しないようです ...

BUY 注文の 場合、(Bid-8*D*Point)>OrderStopLoss()の条件、 OrderStopLoss()==0なら正しく受け入れられる(つまり何らかの値>0)......。

...しかし条件(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0正しくありません( つまり、ある値が< 0 に

なっている) ...

売りの注文でトレイリングストップを正しく

動作させる

ために必要な条件(Ask+8*D*Point)<OrderStopLoss

() を

コードで正しく定式化

する方法を教えて

ください

回答してくださった皆様に前もって感謝

します。
 

こんにちは:インジケータがティック履歴 ファイルを読み込む機能があります。しかし、読み込まれるのは一度だけで、インジケータがロードまたは更新されたときに読み込まれます。ゼロバーの最初のティックが表示されたときに毎回読み取るようにするにはどうしたらよいでしょうか。

void ProcessOldCandles(int limit, TickStruct &lastTick)

{

      int hTicksFile = FileOpen(Symbol() + ".tks", FILE_BIN | FILE_READ | FILE_SHARE_READ | FILE_SHARE_WRITE);

   if (hTicksFile < 1)

      return;

      TickStruct tick;

   while (!IsStopped())

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

      if (tick.time >= Time[limit])

         break;

   }

   lastTick = tick;

   int barIndex = iBarShift(NULL, 0, tick.time);

      while (barIndex >= 0)

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

         if (!IsTickBelongToBar(tick, barIndex))

         barIndex = iBarShift(NULL, 0, tick.time);

         ProcessOneTick(barIndex, tick, lastTick);

   }

      FileClose(hTicksFile);

 
Yaroslav Nykula:

ハローディア.BUY 注文で指定したトレイリングストップコードが 正しく機能する理由を教えてください ...

......しかし、売り 注文のための同じものは、SLを 設定しません... ...

...原因は(Ask+8*D*Point)<OrderStopLoss() という条件にあると思われ これを外せばSLは 設定されますが、 Trailing Stopは 条件を指定しないと正しく動作しないようです ...

BUY 注文の 場合、(Bid-8*D*Point)>OrderStopLoss()の 条件でOrderStopLoss()==0が正しく取られる(つまり何らかの値>0) ...。

...しかしOrderStopLoss()==0時に(Ask+8*D*Point)<OrderStopLoss() という条件は正しくないと思わ れます(つまり、ある値が< 0

)・・・・。

売りの注文でトレイリングストップを正しく

動作させる

ために必要な条件(Ask+8*D*Point)<OrderStopLoss

() を

コードで正しく定式化

する方法を教えて

ください

回答してくださった皆様に前もって感謝

します。

こんにちは、すべて...このフォーラムのブランチで何か非常に低いアクティビティ...この問題はこうして解決される

 if (OrderSymbol()==Symbol()&&OrderType()==OP_SELL&&OrderLots()<=Lot*3&&(Ask+(Tral+TP)*D*Point)<OrderOpenPrice()&&((OrderStopLoss()!=0&&(Ask+Tral*D*Point)<OrderStopLoss())||OrderStopLoss()==0))
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+Tral*D*Point,Digits),NormalizeDouble(OrderOpenPrice()-Stepp*D*Point,Digits),0,0);}} 

...少し長いですが、効果ありです...。もっと短く書く方法を知っている人、短縮してくれませんか、お願いします...それ以外の人は、そのまま使えばいいんです。

 

機能を入力する

OrderCloseByTicket (542534564)

フルロットでチケットによるクローズオーダーを行う。

ロット、価格、スリッページを指定する必要がないようにします。

端末で注文の十字をクリックするのと同じです。


機能を入力する

OrderCloseByPos (0)

ポジションでオーダーを閉じる。


そうすれば、このような面倒な構造を規定する必要はなくなるのです。

  for (int i=1; i<=OrdersTotal(); i++)       //Цикл по всем ордерам,..
     {                                        //отражённым в терминале
      if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий
        {                                     
         // Здесь должен выполняться ..
         // ..анализ характеристик ордеров 
        }
     }                                        //Конец тела цикла
 

こんにちは!2つのマイナス数qとwが等しいときに、if演算子が一方が他方より大きいと思ってしまう、間違った比較をしています。q=-0.0002でwも-0.0002のとき、res12=falseとなりますが、なぜでしょうか?

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред
static bool res12=true;

start()
{   


   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}