初学者的问题 MQL4 MT4 MetaTrader 4 - 页 90

 
toni_stark专家顾问 在1.5年前还能工作,现在却不在图表上了。

论文:运动=生命,休息=死亡。日志上写的是什么? 它在右下角的两个标签上

如果我有一个 - 我会检查并修复它......

 

关于交易、自动交易系统和策略测试的论坛

初学者的问题 MQL4 MT4 MetaTrader 4

Ilya Prozumentov, 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 - класс

我可以为简单和复杂的类型写不同的函数,但编译器不理解函数是由数据类型严格限定的,并一直在骂人。
'<' - 非法操作 使用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 - класс
然后,在编译文件时,出现了这些错误。

'QuickSorts' - 模板不匹配 varQSort.mqh /*错误1*/。
'=' - 类型不匹配 ArrayList.mqh /*错误 2*/。


我应该在代码中修正什么以消除这种类型不匹配?我不明白为什么一开始就发生了这种情况。

P.S.
'<' - 非法操作 使用varQSort.mqh
在这个构架中也困扰着我。我想摆脱的正是这个错误。但我理解这个错误,而我不理解那两个。
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个交易,该函数比较时间并发送管道,但我到目前为止只有一个时间比较。


	          
 
导出报价时,你可以选择从哪一天开始下载报价。

因为当你按下 "下载 "按钮时,6 000 000条报价将被下载。 不是每个人都想用报价数据填满硬盘,等待很长时间直到它们被下载,然后从报价表中删除不必要的数据。

 

你好,亲爱的...你能告诉我为什么为买入 订单指定的追踪止损 代码能正常工作吗...

       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 将被设置,但追踪 止损 在没有指定条件的情况下工作不正确 ...

对于买入 订单如果OrderStopLoss()==0,则 条件(Bid-8*D*Point)>OrderStopLoss(),可以正确接受(即某个值>0)...

...但条件(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0正确的(即 某些<0

) ...

请告知如何在代码中正确制定所需的条件(Ask+8*D*Point)<OrderStopLoss(),以便

卖出

订单中正确使用追踪止损

我感谢所有提前答复的人

 

下午好:有一个功能,指标会读取tick历史 文件。但它只被读取一次,当指标被加载或更新时。我怎样才能使它在每次出现零条的第一个刻度时都能读出?

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:

你好,亲爱的...你能告诉我为什么为买入 订单指定的追踪止损 代码能正常工作吗?

......但同样的一个卖出 订单却没有设置SL...

...原因很可能是在条件(Ask+8*D*Point)<OrderStopLoss() 如果我们删除它,SL 将被设置,但追踪 止损 在没有指定条件的情况下工作不正确 ...

对于买入 订单OrderStopLoss()==0 时,条件(Bid-8*D*Point)>OrderStopLoss()正确采取(即某个值>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)//Если есть следующий
        {                                     
         // Здесь должен выполняться ..
         // ..анализ характеристик ордеров 
        }
     }                                        //Конец тела цикла
 

你好!两个负数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);
        }
      }





}