新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 623

 
neverness:

我已经介绍了最简单的任务。

打开MetaEditor。

点击文件->创建。

在弹出的字段中选择指标。

...

但是这段代码不被MQL翻译器所接受。

我将在大约20分钟内回答

 
neverness:

你们这些孩子到底在做什么,搅乱了水面?

没有人大惊小怪。情况终于开始有点明朗化了。事实证明,你把一个脚本称为一个函数,不能放在主代码的主体中。

也不要忘记,MT的目的是与资金打交道,必须保护其不受第三方的攻击。因此,该语言的大部分限制。

永远 不会。

我已经介绍了一项简单的任务。

打开MetaEditor。

点击文件->创建。

在弹出的字段中选择指标。

在指标OnCalculate()中引入任何带有OnStart()事件的脚本对象。

我个人不知道该怎么做。嗯,比如说像这样。

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[]。
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[]。
const int &spread[])
{
//---
for(int i = 1; i < 100;i++)

{

如果(open[i] > Max)

{

启动时(OnStart)。

而在这里,我们写一个脚本来构建我们所感兴趣的对象。例如,一个椭圆或图表上的一个字母或其他东西

} //if(open)

} //for(int i)
//---为下一次调用返回prev_calculated的值
return(rate_total)
}// OnCalculate

这看起来应该是这样的。

但是,MQL翻译器并没有察觉到这样的代码。

它看起来应该是这样的

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
for(int i = 1; i < 100;i++)
      {
      if(open[i] > Max)
            {
            
           if(int  ObjectFind(chart_id, /* идентификатор графика*/ object_name/* имя объекта*/) < 0)
            ObjectCreate(Здесь параметры функции согласно документации.
                         Например, эллипса, или буквы на графике, или еще чего-нибудь);
               
            }  //if(open)
      }  //for(int i)  
//--- return value of prev_calculated for next call
   return(rates_total);
  } // OnCalculate
 
Vitaly Muzichenko:

大约20分钟后,我将回答。

上传视频花了很长时间--超过40分钟。


//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 {
  EllipseCreate(0, "Ellipse", 0, 0, 0, 0, 0, 0, 0, clrRed, STYLE_SOLID, 1, true, true);
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);
 // ....
  ObjectMove(0, "Ellipse",0,time[1],open[5]);
  ObjectMove(0, "Ellipse",1,time[10],open[15]);
  ObjectMove(0, "Ellipse",2,time[20],open[25]);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

bool EllipseCreate(const long            chart_ID=0,        // ID графика 
                   const string          name="Ellipse",    // имя эллипса 
                   const int             sub_window=0,      // номер подокна  
                   datetime              time1=0,           // время первой точки 
                   double                price1=0,          // цена первой точки 
                   datetime              time2=0,           // время второй точки 
                   double                price2=0,          // цена второй точки 
                   datetime              time3=0,           // время третьей точки 
                   double                price3=0,          // цена третьей точки 
                   const color           clr=clrRed,        // цвет эллипса 
                   const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий эллипса 
                   const int             width=1,           // толщина линий эллипса 
                   const bool            fill=false,        // заливка эллипса цветом 
                   const bool            back=false,        // на заднем плане 
                   const bool            selection=true,    // выделить для перемещений 
                   const bool            hidden=true,       // скрыт в списке объектов 
                   const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- установим координаты точек привязки, если они не заданы 
  // ChangeEllipseEmptyPoints(time1,price1,time2,price2,time3,price3); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим эллипс по заданным координатам 
   if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2,time3,price3)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать эллипс! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим цвет эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину линий эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- включим (true) или отключим (false) режим заливки эллипса 
   ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим выделения эллипса для перемещений 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  } 
附加的文件:
Set.mq5  10 kb
 
Vitaly Muzichenko:

加载视频花了很长时间--超过40分钟。

我有时也会把论坛部分混在一起,在mql5中写一个关于mql4问题的答案。

原则上,在这种情况下,除了文件扩展名外,没有任何变化,但在mql4中,这将是多余的。

 ArraySetAsSeries(time,true);
 ArraySetAsSeries(open,true);

甚至是完全没有必要和无用的。

 
neverness:

你们这些孩子到底在做什么,搅乱了水面?

只要进入MetaEditor,然后输入命令。文件->创建...

这将会出现一个带有不同假文件的表格。

特别是,这些将是加密狗。

- 专家顾问

-自定义指标

- 脚本

- 图书馆,等等。

我们对前三个项目感兴趣:专家顾问、自定义指标和脚本。

让我们来比较一下这些假人。

在专家顾问中,我们有事件。

-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent()......一切,没有了。

在脚本中,我们有事件。

- OnStart() ......就这样了,没有了。

在指标中,我们有事件。

- OnInit(), OnCalculate(), OnTimer, OnChartEvent()......所有的一切,没有了。

这里的自然问题是如何在这些对象之间建立联系。

事实证明,在MQL中,它们之间没有也不可能有任何联系,因为这些对象之间的数据流是完全分离的,它们之间没有任何联系。

此外,我对MQL的创造者把这个事实作为一个 "好 "字给我们感到惊讶。

例如,如果在C++中,我可以很容易地调用BASIC翻译器或Javascript或任何其他翻译器,并切换到例如Android编程环境。

在MQL的框架中,我甚至不能在 "指标 "环境中创建一个所谓的 "脚本",因为指标环境不接受OnStart()命令。

这是一个什么样的怪胎?

而在MQL中,这种丑陋的东西多得很。

他们在每一个步骤中。

我读了MQL的描述--我很惊讶,因为没有别的事情可做。

与此同时,MQL的创造者们大声宣称MQL是C++的后代。

当然,我很抱歉,但我想问MQL的创造者:--什么的继承人?- 在它的丑陋中?


我无意中把MQL与著名的1C编程环境相比较。他们还声称自己是C++的继承人。

但那里的一切都做得更体面。

还有图形对象,以及模块之间的通信等等。

而MQL中又有什么呢?

没有内置的类,没有与线程有关的对象......而且什么都没有。

而且我还没有说过任何关于终端的数学外壳的事情!!!。

那是一个完全独立的惊喜话题!!。

你为什么不读一点帮助,找到你说的那些不存在的东西,读一下SB的内置课程,学习如何有礼貌地寻求帮助(你确实寻求了帮助),学习如何不对试图帮助你的人无礼(不感兴趣地注意这一点)...

总的来说--禁止你在24小时内进行扯皮、无礼和乞讨(你没有展示你的一行代码来证明你所有的陈述,但却厚颜无耻地要求那些对你的问题和陈述做出回应的人,他们会根据你的需要提供工作代码--这在这里并不常见--他们是帮助,而不是为你做,注意--最简单的代码)

无意冒犯--一无所有的人来找我们,会被不理解的东西杀死。

此外,我警告过你要把温度调低。

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

初学者对MQL4的任何问题,对算法和代码的帮助和讨论

Artyom Trishkin, 2018.09.12 14:02

现在试一下,不要有侮辱和傲慢。
我不会容忍在这个论坛上的无礼行为。

 

如何在macOS上安装mt4? 请帮助我。

 

仅仅在虚拟机中。我有并行的昂贵的,但方便和可靠。

https://www.parallels.com/ru/products/desktop/

Запуск Windows на Mac — виртуальная машина Parallels Desktop 14 для Mac
  • www.parallels.com
Можно запустить Windows параллельно с macOS® (перезагрузка не требуется) на компьютерах MacBook®, MacBook Pro®, iMac®, iMac Pro®, Mac mini® или Mac Pro®. Предоставляйте общий доступ к файлам и папкам, копируйте и вставляйте текст и изображения, перетаскивайте файлы между приложениями Mac и Windows. Удобная настройка Parallels Desktop...
 

我在请求帮助。这些问题是。

1.在测试模式下,程序不会对买入和卖出都设置止损。但它修改了待定的订单。

2.它没有实时启动的账户。

请帮助。

我还想请求指出编写程序时可能出现的任何错误。

事先非常感谢。

程序代码。

.输入int Percent=50。

输入int MAGICNUMBER=413。

//介绍长期图表中的指标常数 和震荡器

输入 int Signal_Period_long_term=6;

输入int Fast_EMA_Period_long_term=12。

输入 int Slow_EMA_Period_long_term=24;

//短期图表的指标和震荡器常数的影响参数

输入 int Stochastic_Kperiod_short_term=5;

输入 int Stochastic_Dperiod_short_term=3;

输入 int Stochastic_slowing_short_term=3;

输入ENUM_TIMEFRAMES PERIODs_short_term=PERIOD_M5。

输入ENUM_TIMEFRAMES PERIODs_long_term=PERIOD_H1。

//-----------------------------------------------------------------------------------------

//常见的变量和它们的类型

static datetime New_Time;//当前酒吧的时间。

静态数据时间Time_Local。

double Margin_Percent; //Opening means for opening of orders

double Lots;//确定地段的总数量

double Lots_Volume;

//长期图表的变量和类型

double MacdCurrent_long_term;//MACD参数的当前条形的主线

double MacdPrevious_long_term;//MACD参数的主线的前一棒

double SignalCurrent_long_term;

//短期图表的变量和类型

double Stochastic_Current_short_term_main;//5分钟图上当前条形的随机参数。

double Stochastic_Previous_short_term_main;//5分钟图上前一个条形的随机参数。

double Stochastic_Current_short_term_signal;//5分钟图中当前条形的随机参数。

double Stochastic_Previous_short_term_signal;//5分钟图上的前一个条形的随机参数。

Double StopLoss_BUY;

double StopLoss_Sell;

双重的Price_BUY。

double Price_Sell;

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

//|专家初始化功能|

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

int OnInit()

{

//---


//---

return(INIT_SUCCEEDED)。

}

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

//|专家去初始化函数|

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

空白的OnDeinit(const int reason)。

{

//---


}

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

//|专家勾选功能|

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

空白的OnTick()

{

int ticket,cnt;

int total=OrdersTotal();//确定订单的数量。

bool New_Bar=false; // 标示新条。


//定义长期图表的变量值

MacdCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term, PRICE_TYPICAL,MODE_MAIN,1)。

MacdPrevious_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term, Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2)。

SignalCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term, Signal_Period_long_term,PRICE_TYPICAL,MODE_SIGNAL,1);

//确定短期图表的变量值

Stochastic_Current_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1) 。

Stochastic_Previous_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2) 。

Stochastic_Current_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,1) 。

Stochastic_Previous_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2) 。

//常用变量的定义

Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL, MODE_STOPLEVEL)*MarketInfo(NULL, MODE_POINT)。

Price_SELL=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT)。

StopLoss_BUY=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL, MODE_STOPLEVEL)*MarketInfo(NULL, MODE_POINT)。

StopLoss_SELL=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT)。

Margin_Percent=AccountFreeMargin()*Percent/100。

Lots=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2) 。

Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(), MODE_LOTSTEP),2)。

//-----------------------------------------------------------------------------------------------------------------------

//----- Определение нового бара------------------------------------------------------------------------------------------

New_Time=TimeCurrent()。

Print("Time=",TimeCurrent();

Print("Bar open time =",iTime(NULL,PERIODs_short_term,0))。

if(iTime(NULL,PERIODs_short_term,0)==New_Time) // 比较时间

{

如果(iVolume(NULL,PERIODs_short_term,0)<=2) //比较体积

Print("Bar volume =",Volume[0]);

如果(iBarShift(NULL,PERIODs_short_term,TimeCurrent())==0)//检查条形指数。

Print("Bar index =",iBarShift(NULL,PERIODs_short_term,TimeCurrent())。

New_Bar=true; // 一个新的条形图被捕获。

Print("New_Bar");

}

else if(New_Bar==false) // 如果该条不是新的...

{

Print("Bar is not new");

返回。

}

if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT)

{

Print("没有足够的资金。自由资金=",AccountFreeMargin())。

返回。

}

//----确定地段编号

如果(Lots>Lots_Volume)

{

Lots=NormalizeDouble(Lots_Volume,2)。

Print("手数:",Lots);

}

否则如果(Lots<Lots_Volume)

{

Lots=NormalizeDouble(MathFloor(Lots),2)。

Print("手数:",Lots);

}

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

//|如果订单数量等于零,则开仓的条件|。

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

如果(total<1)

{


如果(MacdCurrent_long_term<0 &&MacdCurrent_long_term>SignalCurrent_long_term)

Print("Condition is true for BUY");

{

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

//| 仅适用于开立买入长仓的条件。

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

if(Stochastic_Current_short_term_main<Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main>=Stochastic_Previous_short_signal)

{

ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,Blue) 。

如果(ticket>0)//检查打开的位置

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

Print("BUY order open : " ,OrderOpenPrice())。

返回。

}

else Print("BUY订单打开错误:",GetLastError())。

返回。

}

}

}

如果(MacdCurrent_long_term>0 &&MacdCurrent_long_term<SignalCurrent_long_term)

Print("Condition is true for SELL");

{

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

//|仅适用于空头卖出头寸的开仓条件。

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

if(Stochastic_Current_short_term_main>Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main<=Stochastic_Previous_short_signal)

{

ticket=OrderSend(Symbol(,OP_SELLSTOP,Lots,Price_SELL,3,0,0,NULL,MAGICNUMBER,0,Green);

如果(ticket>0)//检查打开的位置

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

Print("SELL order open : ",OrderOpenPrice());

返回。

}

else Print("错误打开卖出订单:",GetLastError())。

返回。

}

}

}

}


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

//|订单修改条件|

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


for(cnt=0;cnt<total;cnt++)

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

//||

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

{

if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))

继续。

if(OrderMagicNumber()==MAGICNUMBER && // 检查订单的神奇数字。

OrderSymbol()==Symbol() //检查订单符号。

{

//---------多头仓位开张

如果(OrderType()==OP_BUYSTOP)

{

如果(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)

{

如果(OrderModify(OrderTicket(),Price_BUY,0,0,Blue))

Print("Price_BUY订单已被成功修改。")。

else Print("修改BUYStop订单错误。错误代码=",GetLastError())。

返回。

}

else Print("修改价格高于订单价格")。

返回。

}

如果(OrderType()==OP_SELLSTOP)

{

如果(OrderOpenPrice()<Price_SELL && Bid>Price_SELL)

{

如果(OrderModify(OrderTicket(),Price_SELL,0,0,Green))

Print("Price_SELL订单已被成功修改。");

else Print("修改订单SELLStop的错误。错误代码=",GetLastError()。

返回。

}

}

如果(OrderType()==OP_BUY)

{

如果(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)

{

如果(OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss_BUY,0,0,Blue))

Print("Price_BUY订单价格成功修改。");

else Print("修改BUY订单错误。错误代码=",GetLastError())。

返回。

}

}

如果(OrderType()==OP_SELL)

{

如果(OrderStopLoss()>StopLoss_SELL && StopLoss_SELL>Bid)

{

如果(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

Print("Price_SELL订单价格成功修改。");

else Print("修改卖出订单错误。错误代码=",GetLastError()。

返回。

}

}

}

}


}

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

 

帮助修复指标中的一个错误,当它在一小时的最后一根蜡烛上时,它不能画出当天的高点和低点。

https://prnt.sc/kut6xo

https://prnt.sc/kut79b

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
附加的文件:
 
Michail_David:

我在请求帮助。这些问题是。

1.在测试模式下,程序不会对买入和卖出都设置止损。但修改待处理订单的工作进展顺利。

2.它没有实时启动的账户。


这就是如何

 if(OrderType()==OP_SELL)

           {

            if(OrderStopLoss()!= StopLoss_SELL && StopLoss_SELL>Bid)

将修改AND代码,正确插入(Alt+S)。