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++)
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---for(int i = 1; i < 100;i++)
{
if(open[i] > Max)
{
if(intObjectFind(chart_id, /* идентификатор графика*/ object_name/* имя объекта*/) < 0)
ObjectCreate(Здесь параметры функции согласно документации.
Например, эллипса, или буквы на графике, или еще чего-нибудь);
} //if(open)
} //for(int i) //--- return value of prev_calculated for next callreturn(rates_total);
} // OnCalculate
//+------------------------------------------------------------------+//| Set.mq5 |//| Copyright 2018 |//+------------------------------------------------------------------+#property copyright"Copyright 2018"#property version"1.00"#property indicator_chart_window#property indicator_plots0//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
EllipseCreate(0, "Ellipse", 0, 0, 0, 0, 0, 0, 0, clrRed, STYLE_SOLID, 1, true, true);
//--- indicator buffers mappingreturn(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &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 callreturn(rates_total);
}
//+------------------------------------------------------------------+bool EllipseCreate(constlong chart_ID=0, // ID графика conststring name="Ellipse", // имя эллипса constint sub_window=0, // номер подокна datetime time1=0, // время первой точки double price1=0, // цена первой точки datetime time2=0, // время второй точки double price2=0, // цена второй точки datetime time3=0, // время третьей точки double price3=0, // цена третьей точки constcolor clr=clrRed, // цвет эллипса constENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий эллипса constint width=1, // толщина линий эллипса constbool fill=false, // заливка эллипса цветом constbool back=false, // на заднем плане constbool selection=true, // выделить для перемещений constbool hidden=true, // скрыт в списке объектов constlong 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);
}
Можно запустить Windows параллельно с macOS® (перезагрузка не требуется) на компьютерах MacBook®, MacBook Pro®, iMac®, iMac Pro®, Mac mini® или Mac Pro®. Предоставляйте общий доступ к файлам и папкам, копируйте и вставляйте текст и изображения, перетаскивайте файлы между приложениями Mac и Windows. Удобная настройка Parallels Desktop...
我已经介绍了最简单的任务。
打开MetaEditor。
点击文件->创建。
在弹出的字段中选择指标。
...
但是这段代码不被MQL翻译器所接受。
我将在大约20分钟内回答
你们这些孩子到底在做什么,搅乱了水面?
没有人大惊小怪。情况终于开始有点明朗化了。事实证明,你把一个脚本称为一个函数,不能放在主代码的主体中。
也不要忘记,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翻译器并没有察觉到这样的代码。
它看起来应该是这样的
大约20分钟后,我将回答。
上传视频花了很长时间--超过40分钟。
加载视频花了很长时间--超过40分钟。
我有时也会把论坛部分混在一起,在mql5中写一个关于mql4问题的答案。
原则上,在这种情况下,除了文件扩展名外,没有任何变化,但在mql4中,这将是多余的。
甚至是完全没有必要和无用的。
你们这些孩子到底在做什么,搅乱了水面?
只要进入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/
我在请求帮助。这些问题是。
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
我在请求帮助。这些问题是。
1.在测试模式下,程序不会对买入和卖出都设置止损。但修改待处理订单的工作进展顺利。
2.它没有实时启动的账户。
这就是如何
将修改AND代码,正确插入(Alt+S)。