看一下MACD样本代码。
改变内部使用的MACD指标的变量,以获得Ichmoku指标值。
做一些小的改动,然后合并代码,检查你的语法是否正确。
编辑 -这里 还有如何使用Ichmoku指标的方法。
好的,我已经根据MACD样本重新做了一遍,但有这些错误。
'end_of_program' - ending bracket '}' expected C:\Program Files (x86)\MetaTrader 4experts\ICHIMOKU.mq4 (80, 13)
'end_of_program' - 不平衡的左括号 C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)
这是新的版本。
//+------------------------------------------------------------------+
//| ICHIMOKU.mq4|
//| Copyright © 2012, MetaQuotes Software Corp.|
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
外部双倍TakeProfit = 50;
外部双数 Lots = 0.1;
extern double TrailingStop = 30;
extern double Tenkan = 9;
extern double Kijun = 26;
//+------------------------------------------------------------------+
//| 专家初始化函数 |
//+------------------------------------------------------------------+
int start()
{
double tenkan_sen;
double kijun_sen;
int cnt, ticket, total;
//----
如果(Bars<100)
{
Print("Bars小于100")。
return(0);
}
如果(TakeProfit<10)
{
Print("TakeProfit小于10")。
return(0); // 检查TakeProfit
}
//----
total=OrdersTotal();
如果(total<1)
{
//没有识别出已开的订单
如果(AccountFreeMargin()<(1000*Lots))
{
Print("我们没有钱。Free Margin = ", AccountFreeMargin())。
return(0);
}
// 检查多头头寸(BUY)的可能性
if(tenkan_sen>kijun_sen)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ichimoku",16384,0,Green) 。
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY order opened : ",OrderOpenPrice());
}
否则 Print("打开BUY订单错误 : ",GetLastError())。
return(0);
// 正确入市很重要。
// 但更重要的是正确退出......
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)。
if(OrderType()<=OP_SELL && // 检查开仓位置
OrderSymbol()==Symbol()) //检查符号
{
如果(OrderType()==OP_BUY) // 多头头寸已经建立
{
//是否应该平仓?
如果((tenkan_sen<kijun_sen)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //关闭头寸
return(0); // 退出
}
// 检查追踪止损
if(TrailingStop>0)
{
如果(Bid-OrderOpenPrice()>Point*TrailingStop)
{
如果(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green) 。
返回(0)。
}
}
}
}
}
}
return(0);
}
在这一点上,在 "你的 "代码中.. .
} else Print("Error opening BUY order : ",GetLastError()); return(0); // <------ here ! ! ! // it is important to enter the market correctly, // but it is more important to exit it correctly... for(cnt=0;cnt<total;cnt++) {
. . . 标示在这里!!!你 已经从放置订单转为关闭订单 . . . 但你在代码的购买部分可能缺少两个关闭 (} ) 大括号 . . . 如果你以合理的方式缩进你的代码,就很容易看到。
好的,谢谢。我做了这个改动,删除了'end_of_program'--结尾的括号'}'预计C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)
它被标记为<=======
// 检查多头头寸(BUY)的可能性
if(tenkan_sen>kijun_sen)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ichimoku",16384,0,Green) 。
如果(ticket>0)
} <=======
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY order opened : ",OrderOpenPrice());
}
否则 Print("打开BUY订单错误 : ",GetLastError())。
return(0);
}
// 正确入市很重要。
// 但更重要的是正确地退出市场......
虽然看起来它不应该出现在那里
你在这一行有一个多余的开口括号......。
if ( ( tenkan_sen<kijun_sen ) // <-- surplus (
你初始化了这些变量,但没有给它们任何值.. .
if ( tenkan_sen > kijun_sen )
. . . 所以测试将永远是假的。 这个EA将永远不会下订单。
你的代码在一个有缩进的版本中,并且可以编译.. .
//+------------------------------------------------------------------+ //| ICHIMOKU.mq4 | //| Copyright © 2012, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2012, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double Tenkan = 9; extern double Kijun = 26; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int start() { double tenkan_sen; double kijun_sen; int cnt, ticket, total; //---- if(Bars<100) { Print("bars less than 100"); return(0); } if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // check TakeProfit } //---- total=OrdersTotal(); if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // check for long position (BUY) possibility if(tenkan_sen>kijun_sen) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"ichimoku",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // added by RaptorUK } // added by RaptorUK // it is important to enter the market correctly, // but it is more important to exit it correctly... for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // check for opened position OrderSymbol()==Symbol()) // check for symbol { if(OrderType()==OP_BUY) // long position is opened { // should it be closed? if(tenkan_sen<kijun_sen) // removed surplus ( RaptorUK { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position return(0); // exit } // check for trailing stop if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } } } return(0); }
我一直在尝试创建一个专家顾问,当Tenkan-sen>kijun-sen(当Tenkan-sen线高于kijun-sen线)时自动买入1个单位,然后在Tenkan-sen低于kijun-sen时出售。
我是一个完全的新手,昨天开始尝试将样本拼凑起来等。
以下是结果,我知道这可能是一坨屎。
当我试图编译时,在int start()行(从导航器中的 "trade "脚本中复制的)得到了经典的"'('-函数定义意外"。
请你提出建议,我怎样才能让这个想法奏效,提前感谢。
#property copyright"#copyright#"
#property link "#link#"
extern double Lots = 0.1;
extern double Tenkan = 9;
extern double Kijun = 26;
//+------------------------------------------------------------------+
//| 专家初始化函数 |
//+------------------------------------------------------------------+
int init()
{
Bars<=Tenkan, Bars<=Kijun;
//----
如果(Bars<=Tenkan>Bars<=Kijun)
{
Print ("Tenkan-sen大于Kijun-sen");
return(0);
}
//----
//+------------------------------------------------------------------+
//| 脚本 "为所有资金进行交易" | |
//+------------------------------------------------------------------+
int start()
{
//----
if(MessageBox("Do you really want to BUY 1.00 "+Symbol()+" at ASK price?" 。
",MB_YESNO|MB_ICONQUESTION)!=IDYES) return(1);
//----
int ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0, "专家评论",255,0,CLR_NONE)。
如果(ticket<1)
{
int error=GetLastError();
Print("Error = ",ErrorDescription(error))。
返回。
}
//----
OrderPrint()。
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|专家去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
Bars<=Tenkan, Bars<=Kijun;
//----
如果(Bars<=Tenkan<Bars<=Kijun)
{
Print ("Tenkan-sen less than Kijun-sen");
return(0);
}
//----
int start()
{
//----
if(MessageBox("Do you really want to SELL 1.00 "+Symbol()+" at Bid price? ",
",MB_YESNO|MB_ICONQUESTION)!=IDYES) return(1);
//----
int ticket=OrderSend(Symbol(),OP_SELL,1.0,Bid,3,0,0, "专家评论",255,0,CLR_NONE)。
如果(ticket<1)
{
int error=GetLastError();
Print("Error = ",ErrorDescription(error))。
返回。
}
//----
OrderPrint()。
return(0);
}
//+------------------------------------------------------------------+