任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 360

 
gyfto:

我有一个很幼稚的问题。变量是在代码头中声明的。它们应该是全球性的。但我不明白其中的区别

如果该变量在标题中被声明,则为 "A"。理想情况下,按变量的范围。但在这两种情况下,它在函数内部是可见的。我做了一个测试(脚本)。

- 没有注意到任何差异。你能解释一下它们的区别吗,因为我不明白。

那里有一个额外的statik。没有它也可以工作。在函数中声明静态是有意义的。仅指功能块的范围。
 
Zhunko:
在函数中声明静态是有意义的。该范围只是一个功能块。


它的工作方式也是如此。

int a = 10;
int start(){
   Alert(StringConcatenate("st: a = ", a));//st: a = 10
   f1(); Alert(StringConcatenate("f1: a = ", a));//f1: a = 10
   f2(); Alert(StringConcatenate("f2: a = ", a));//f2: a = 10
}
void f1(){
   int a = 11;
   return;
}
void f2(){
   static int a = 12;
   return;
}

在哪种情况下,会感觉到差异?ALXIMIKS,也谢谢你的回答。

 

你好!

你能告诉我如何在安装在iphone/ipad上的mt4上安装一个额外的指标/机器人吗? 原则上,这可能吗?对于Windows来说,这很简单,但对于苹果 的移动产品来说,就不是那么明显了。

逻辑上说,这是可能的。毕竟,一些指标已经被预装了。但复制什么和在哪里复制并不清楚,文件结构是不同的。有没有人没有遇到过这样的问题?

提前感谢。

 

我正在做一个基于移动平均线 的指标。这个想法是为了切断指定点内的不重要的运动。比方说,我们设置了一个50点的过滤器。该指标正在下降,但下降幅度小于50点,因此我们取昨天的平均值,并将其记下,为当前日期设定其水平。在下一个交易日,我们检查差值,即当前值减去我们记录的值,如果总数不超过50点,我们将存储在静态变量中的水平设置为当前值。如果该值超过它,该值就成为当前值,即类似于移动平均线,移位为零。我已经尝试了不同的变化,但到目前为止,我还没有找到正确的解决方案。

为了简单起见,我在此附上只画下降的代码。问题是,该指标在上升中绘制。而最主要的是,当我在测试器中运行时,我可以直观地看到指标的变化,而在过滤器外却没有出口。 我假设在某个地方,记录的 "MA_otshet "的值被丢失了。

#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red 
//--- input parameters
//--- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double
    raznica,raznica_static,MA_0_t,MA_1_t;
   static double MA_otshet;  //здесь хранится запись значения MA_otshet
   
   for(int i=0;i<Bars;i++)
   {  
      MA_0_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+0);  
      MA_1_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+1); 
      raznica=MA_0_t-MA_1_t; //разница между сегодня и вчера по скользящей средней
      raznica_static=MA_0_t-MA_otshet; //разница между сегодня и MA_otshet

      if(raznica > -0.005 && raznica <= 0) // если raznica не превышает заданное число 
          {
          MA_otshet=MA_1_t; // записываем значение MA_otshet
          }
      if(raznica_static > - 0.005 && raznica_static <= 0) //если raznica_static не превышает заданное число
          {
          ExtMapBuffer1[i]=MA_otshet;  // то рисуем значение индикатора, как записанный MA_otshet
          }
      if(raznica_static < - 0.005) // если raznica превышает заданное число
          {
          ExtMapBuffer1[i]=MA_0_t; // то рисуем значение по текущей цене
          }
   } 
   return(0);
  }
//+------------------------------------------------------------------+
 

下午好,请帮助。

我需要所有的订单在23点55分关闭,而周五的交易在22点结束,所以交易有问题。

我发现在教程脚本的时间部分的帮助下,请添加当天的参数号码,即周五的订单在21 55关闭,在正常的日子里在23 55关闭,或者可以分享链接,如果有现成的解决方案。

//--------------------------------------------------------------------
// timeevents.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern double Time_Cls=16.10;          // Время закрытия ордеров
bool Flag_Time=false;                  // Флаг, сообщения ещё не было 
//--------------------------------------------------------------- 2 --
int start()                            // Спец. функция start
  {
   int    Cur_Hour=Hour();             // Серверное время в часах
   double Cur_Min =Minute();           // Серверное время в минутах
   double Cur_time=Cur_Hour + Cur_Min100; // Текущее время
   Alert(Cur_time);
   if (Cur_time>=Time_Cls)             // Если наступило время события
      Executor();                      //.. то выполняем задуманное
   return;                             // Выход из start()
  }
//--------------------------------------------------------------- 3 --
int Executor()                         // Пользовательская функция
  {
   if (Flag_Time==false)               // Если ещё не было сообщения..
     {                                 // .. то сообщаем (1 раз)
      Alert("Время важных новостей. Закройте ордера.");
      Flag_Time=true;                  // Теперь сообщение уже было
     }
   return;                             // Выход из польз. функции
  }

//--------------------------------------------------------------- 4 --

 
r772ra:
简单!!!。


谢谢。但你是否有一个线索。我只需要1天的信息。那就是显示最后一个工作日的利润信息

变量被声明。它不起作用。都是零。

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();

 
Zolotai:


谢谢。但是,呃,你能给我一个提示吗?我只需要1天的信息。也就是说,要显示最后一个工作日的利润信息

变量被声明。它不起作用。这都是无效的。

for (p=0; p<OrdersHistoryTotal(); p++) {

if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {

if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )

p0+=OrderProfit()+OrderCommission()+OrderSwap();

}

}

double r0=p0*100/AccountBalance();


这个 专家顾问有MM_Light库和其中的功能。

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Считаем итоги работы по своим ордерам                                      |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fCalculate_Pribul (int fi_OP = -2,              // тип (BUY\SELL) учитываемых ордеров
                          datetime fdt_TimeBegin = 0,  // момент времени, с которого производим расчёт
                          string fs_Comment = "")      // комментарий ордеров
{
    double   ld_Pribul = 0.0;
    int      history_total = OrdersHistoryTotal();
//----
    for (int li_ORD = 0; li_ORD < history_total; li_ORD++)
    {
        if (!fCheck_MyOrders (li_ORD, fi_OP, MODE_HISTORY)) continue;
        if (fdt_TimeBegin > OrderCloseTime()) continue;
        if (fs_Comment != "") {if (StringFind (OrderComment(), fs_Comment) < 0) continue;}
        ld_Pribul += (OrderProfit() + OrderSwap() + OrderCommission());
    }
//----
    return (ld_Pribul);
}
这个原则很容易理解。为了计算当天的盈亏,你需要把数值传给它:fCalculate_Pribul (-2, iTime (Symbol(), PERIOD_D1, 0), "")。
 
sannin:

下午好,请帮助。

我需要所有的订单在23点55分关闭,而周五的交易在22点结束,所以交易有问题。

我发现在教程脚本的时间部分的帮助下,请添加当天的参数号码,即周五的订单在21 55关闭,在正常的日子里在23 55关闭,或者可以分享链接,如果有现成的解决方案。

//--------------------------------------------------------------- 4 --

当然,这段代码是从头开始写的,但它应该可以工作,至少你应该理解它。

int start() {
switch(DayOfWeek()){// если пятница,суббота, и т.д.
 case 4://пятница
 case 5://суббота на всякий случай
 case 6://воскресенье на всякий случай
             if((Hour()==22 && Minute()>=00) || Hour()>22){
                 //   Выполняем какое то действие  в пятницу после 22:00
             }
             break;
 case 0://понедельник
 case 1://вторник
 case 2://среда
 case 3://четверг
             if(Hour()>23 || (Hour()==23 && Minute()>55)){
                // все остальные действия в нормальные рабочии дни ПОСЛЕ 23:55
             }
              break;
  default:   {//все остальные действия в нормальные рабочии дни до 23:55
  
             }
 }                   
}
 
SetIndexStyle(1,DRAW_LINE,STYLE_DASH,0);
这一部分在哪里规定了线的厚度?我甚至感到很尴尬。:(
 
Link_x:
这一部分在哪里规定了线的厚度?我甚至感到很尴尬。:(
最后一个参数。