[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 1126

 
drknn:


代码是错误的。首先,如果start()函数是int类型的,它应该返回一个整数值。你有一个只由一个条件返回的回报。而如果条件不满足,start()函数应该向终端返回什么?

此外,你的检查太复杂了--最好按以下方法做:我们创建一个订单的计数器,今天开放和关闭。如果今天关闭的订单数量大于零,那么你就不做交易。否则,我们被允许进行交易。

将int改为void...没有帮助

说实话,我不太明白如何做一个订单的计数器,并且仍然能够启用/禁用一次性的每日交易选项....。

.... 认为-认为-认为-认为我将这样尝试

如果(CalculateCurrentOrders(Symbol())==0 && Orders==0)

{

CheckForOpen()。

如果(WaitForNewDay) {Orders++;}

返回。

}

重置计数器。

如果(WaitForNewDay)CheckForNewDay()。

空白的CheckForNewDay()。

{

tm=iTime(Symbol(),PERIOD_D1,0)。

if (bt!=tm) {bt=tm; Orders=0;}

}

总之,回到了我要逃避的问题上 ))))

 
dzhini:

将int改为void...没有帮助

说实话,我不明白如何制作一个订单计数器,并且仍然能够启用/禁用一次性日间交易选项....。

-------------

无论如何,回到我所逃避的问题上 ))))

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                          Copyright © 2010, Drknn |
//|                                                    drknn@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Drknn"
#property link      "drknn@mail.ru"

// ---------- Пользовательские переменные ----------------------------
extern int      MAGIC=0;//У ордеров открытых вручную MAGIC=0

// ------------ Вспомогательные переменные --------------------------
string    ExpertName="0";// имя советника
string    SMB;
bool      DobroTorga;

//+------------------------------------------------------------------+
//|                  Блок инициализации                              |
//+------------------------------------------------------------------+
int init(){

  SMB=Symbol();
  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                            |
//+------------------------------------------------------------------+
int deinit(){
        if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
  if(!IsTradeAllowed()){
    Comment("Торговля запрещена в настройках терминала, либо торговый поток занят");
    Print("Торговля запрещена в настройках терминала, либо торговый поток занят");
    return(0);
  }
  DobroTorga=true;
  if(SchBuy(MAGIC)+SchSell(MAGIC)+HistSchBuy(MAGIC)+HistSchSell(MAGIC)>0){
    DobroTorga=false;
  }
  if(DobroTorga==true){
    // ---- добро торговать есть - ставим ордера ---------
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+


// =================================================================================================
// ************************* Счётчики ордеров ******************************************************
// =================================================================================================

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== SchSell()  ===============================
//  Функция возвращает количество Sell-ордеров
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        SchSell++;
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================

//=========== HistSchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров сегодняшнего дня в истории
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int HistSchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchBuy++;
        }
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== HistSchSell()  ===============================
//  Функция возвращает количество Sell-ордеров сегодняшнего дня в истории
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int HistSchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================
 
请在代码方面帮助我。我手动绘制并移动一条水平线,当价格触及它时,应该触发信号。
 
Alexandr24:
请在代码方面帮助我。我手动绘制并移动一条水平线,当价格触及它时,就会触发一个信号。

价格触及该线 - 有一个信号。我理解。代码有什么问题?
 
drknn:


今天由你负责)))谢谢你,我会研究的。
 
对不起,我没有正确设置任务))。我需要一个能做到这一点的代码。
 
Alexandr24:
对不起,我设置的任务不正确))。你所需要的是一个能做到这一点的代码。


你需要了解的第一件事是,线是一个物体。编程代码通过对象的名称来区分它们。你需要在代码中写下线的名称,然后当你把线放到图表上时,你需要进入它的属性,把名称改为你在代码中写的那个。只有这样,代码才会理解,你需要处理从这个对象中获取的读数。

接下来在代码中,你需要查询线路所处的价格。请求是通过双ObjectGet(string name, int prop_id)函数进行的。你需要指定你的行的名称而不是名称,指定OBJPROP_PRICE1而不是prop_id。这样,你就可以通过编程获得这一行的价格。然后在代码中,你需要检查价格是否触及这一行。例如:如果前一个tick的价格低于设置线的水平,并且在当前的tick上更多或等于这个水平,那么这个触摸就发生了。

亚历山大,如果你不能设法用代码做什么,他们可以帮助你。如果你需要代码为你实现,请到https://www.mql5.com/ru/job。

 
int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----

 double n=ObjectGet("n",OBJPROP_PRICE1); 
 if (Close[0]==n&&Close[0]!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
我这样做了,但当Close[0]==n时,信号不起作用。如何解决这个问题?条件已经满足,但由于某些原因,它没有发挥作用。
 
Alexandr24:
我已经做了,但当Close[0]==n时,信号不起作用。如何解决这个问题?


那么,从代码来看,你已经做了一个指标。因此,要检查这部分代码是否有效,你必须坐等下一个嘀嗒声触及该线。最好是创建一个脚本来测试这部分代码,因为它将给你带来即时的结果。

你需要确保的第一件事是,代码实际上看到了你的行。你是如何做到这一点的?你需要询问它的价格,并将其显示为一个警报。做到这一点。

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
  string LineName="1";
  double MyLine=-100;
  MyLine=ObjectGet(LineName,OBJPROP_PRICE1);
  if(MyLine>0){
    Alert ("Горизонтальная линия ",LineName," установлена на уровень = ",MyLine);
  }
  else{
    Alert("Запрос значения линии ",LineName," вренул ошибку № ",GetLastError());
  }
  return(0);
}
//+------------------------------------------------------------------+

现在,脚本已经被重新编译,我们打开任何图表,在上面画一条水平线。然后我们输入它的属性,由于我们在代码中给行起了 "1 "的名字,我们也在行的属性中设置了这个名字。

单击 "确定"。我们把脚本放在图表上,并确保警报已经返回了正确的价格。我们将图表中的线条移动到另一个地方,并再次将脚本扔回图表,确保如果我们手动改变线条的位置,代码仍然可以看到并识别它。

然后我们以同样的方式继续。

 

通过测试器对指标进行测试,同时开启可视化功能。我对代码进行了一些修正,因为要想触发警报,数值应该被规范化。但是,如果你在当前条上移动线,比如说一个小时,那么警报将只被触发1次,而随后在当前条上移动线的警报由于某种原因而不能工作。我必须等待另一个酒吧。

int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----
double b=NormalizeDouble((Close[0]),Digits);
 double n=NormalizeDouble(ObjectGet("n",OBJPROP_PRICE1),Digits); 
 if (b==n&&b!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
原因: