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

 

Dratuti。你是如何制作这样的面板的?

 
Andrey Sokolov:

Dratuti。你是如何制作这样的面板的?

以kodobase为例,重新做,有很多顾问的面板可以满足各种口味。它从背景 开始
 
Andrey Sokolov:

Dratuti。你是如何制作这样的面板的?

有了图形化的对象。
 
 
Andrey Sokolov:
Vitaly Muzichenko,Artyom Trishkin 谢谢你们。
Nzt
 
trader781:

继续写另一个猪八戒,在测试仪中也输了,否则我们怎么能长出麋鹿。

目前,有一个所需的参数,它应该负责在前一个或多个订单关闭后打开下一个订单的可能性。

有两种情况

1) 如果该值为真

开立订单

过程

关闭

并重新开放

2) 如果是假的

打开订单

过程

关闭

然后做ExpertRemove

整个问题是,这两个条件是相互排斥的,但它们必须结合在一个专家顾问中,因为

1) 值在开始时设定

2)该值在输入和处理条件中被设定,并接受处理(如果为真,则打开)。

3) 关闭后,我们设置为假

如果有人对这种事情感兴趣,我很乐意听听我的变种。
我在逻辑上有问题。

这很简单。

  1. 开立订单
  2. 处理订单
  3. 关闭订单
  4. 检查状况和...
    • 如果为真,则ExpertRemove()
  5. 再一次
 
Artyom Trishkin:
我们在逻辑上有问题。

一切都很简单。

  1. 开立订单
  2. 处理订单
  3. 关闭订单
  4. 检查条件和...
    • 如果为真,则ExpertRemove()
  5. 再做一次
似乎有些不对劲,如果这是真的--你必须砍一棵卷心菜,而不是去灌木丛)
 
Vitaly Muzichenko:
有些事情似乎不对,如果是真的--你应该是在切卷心菜,而不是在灌木丛中)
错了。假的。我不知道这个测试是什么...妈的,还是有一些逻辑的。
还是你只是想聊天?
 

请告知。专家顾问不在终端中开立订单。汇编正在进行中,根据图表,订单应该被打开。但他们不是。我把代码附在后面。

double Lots=NormalizeDouble((AccountFreeMargin()/100*Percent)/MarketInfo(Symbol(),MODE_MARGINREQUIRED),1);//确定手的数量。
double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,0);//当前酒吧的MACD参数。
double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,1);//前一栏的MACD参数。
double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,2);//主线的MACD参数偏移2条。
double StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//参数Trailing Stop by ParabolicSAR parameters of the current bar。
double Previous_StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//StopLoss参数由ParabolicSAR的前一棒参数决定。
double PSARCurrent=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//parabolicSAR参数的当前栏。
double PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//前一个柱状图的抛物线参数。
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
空白的OnTick()
{
静态数据时间New_Time=TimeCurrent();//当前酒吧的时间。
bool New_Bar=false; // 标示新条。
int ticket,total,cnt;
//---------------------------------------------------------------------------
{
New_Bar=false; // 没有新条形。
if(Time[0]==New_Time) // 比较时间
{
New_Bar=true; // New_Bar被捕获。
如果(New_Bar==false) // 如果一个酒吧不是新的
return; // ...然后退出
}
}
total=OrdersTotal();//确定订单的数量。
如果(total<1)
{
//------没有未结订单
如果((AccountFreeMargin()/100*Percent)<MarketInfo(Symbol(), MODE_MARGINREQUIRED)*(MarketInfo(Symbol(), MODE_MINLOT)
//检查是否有资金用于开立最小的手数
{
Print("没有足够的资金。自由资金=",AccountFreeMargin())。
返回。
}

//--多头开仓条件(买入)
如果((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,0,NULL,MAGICNUMBER,0,Green) 。
如果(ticket>0)//检查打开的位置
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order open : " ,OrderOpenPrice())。
否则
Print("BUY订单打开错误:",GetLastError())。
返回。
}
}

//--建立空头头寸的条件(卖出)。
如果((MacdCurrent<0 &&MacdPrevious1>=0 &&MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(,OP_SELL,Lots,Bid,3,StopLoss,0,NULL,MAGICNUMBER,0,Red);
如果(ticket>0)//检查打开的位置
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Sell order open : ",OrderOpenPrice())。
否则
Print("错误打开卖出订单:",GetLastError())。
返回。
}
}
//---退出 "没有开放订单 "区块

}
//---正确入市很重要,但正确出市更重要。
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MAGICNUMBER && // 检查订单的神奇数字。
OrderSymbol()==Symbol() //检查订单符号。
{
//---------多头仓位开张
如果(OrderType()==OP_BUY)
{
//---必须关闭?
如果((MacdCurrent<0 &&MacdPrevious1>=0 &&MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
//------订单关闭和退出
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error",GetLastError())。
返回。
}
//------------------ 修改订单的止损方式
如果(StopLoss>Previous_StopLoss && StopLoss<iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Print(" 订单修改错误。错误代码=",GetLastError())。
否则
Print("订单的止损价格已被成功修改;)
返回。
}
}

否则 // 做空
如果(OrderType()==OP_SELL)
{
//---必须关闭?
如果((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
//------订单关闭和退出
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error",GetLastError())。
返回。
}
//----------------- 修改订单的止损方式
如果(StopLoss<Previous_StopLoss && StopLoss>iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Print("订单修改错误。错误代码=",GetLastError())。
否则
Print("订单的止损价格已被成功修改;)
返回。
}
}
}

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

 
trader781:

是的,这比那更简单。

但如果我们保留这一点作为后备措施,并采取以下措施呢?

检查条件和...
  • 如果为真,那么机器人就会以最少的活动挂起,最好是完全没有活动。

即如何阻止输入的进一步操作

return(0); 但这是不可取的--它不会处理其他事情。
原因: