你好。编程专家可以提供帮助。
专家顾问:买入 - 在超卖区域(低于25)的随机指标和信号交叉,条件是
枢轴线低于价格水平(一种支持);相反,枢轴线高于价格水平。
测试显示了一些编程上的缺陷。1)如何在每个信号下只开一个交易(在测试过程中,我失去了一切,当信号仍然活跃(假),而平仓条件已经发生)。2)我是否正确设置了 "枢轴 "高于/低于价格水平的条件。 我有疑问,看了测试的图表。
如果我可以用具体的例子来帮助你。我擅长的编程水平是简单的编译!!!!!!!。
外置双Lots = 0.1。
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
双P_up0,P_down0,P_up1,P_down1。
double st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, ticket, total;
如果(Bars<100)
{
Print("小于100的条形图")。
return(0);
}
P_up0=iCustom(0,0, "Price channel",11,0,0)。
P_down0=iCustom(0,0, "Price channel",11,1,0)。
P_up1=iCustom(0,0, "Price channel",11,0,1)。
P_down1=iCustom(0,0, "Price channel",11,1,1)。
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1)。
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1) 。
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2)。
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2) 。
Pivot=iCustom(0,0,Pivot,0,1)。
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1)。
//设置所有数据
total=OrdersTotal()。
如果(total<1)
{
// 检查自由保证金
如果(AccountFreeMargin()<(1000*Lots))
{
Print("我们没有钱。Free Margin = ", AccountFreeMargin();
return(0);
}
// BUY位置开放的条件
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,Green);
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY订单打开:",OrderOpenPrice())。
}
else Print("错误打开BUY订单:",GetLastError())。
return(0);
}
//打开卖出头寸条件
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,Red)。
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("卖出订单开仓:",OrderOpenPrice())
}
else Print("错误打开卖出订单:",GetLastError())。
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)。
如果(OrderType()<=OP_SELL &&)
OrderSymbol()==Symbol())
{
如果(OrderType()==OP_BUY)//多头开仓
{
// 多头平仓的条件
如果(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)。
return(0);
}
}
否则
{
// 空头头寸关闭的条件
如果(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)。
return(0);
}
}
}
}
return(0);
}
1)如何在一个信号下只做一个交易的开放
我需要这样的东西。
if(total<1) { if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Alert("Покупка: ",OrderOpenPrice()); } else Alert("ошибка:по цене ",OrderOpenPrice()); return(0); } return(0); }
我还是不明白我在这段代码中改变了什么。它似乎是一样的!
还有,我怎样才能把它编程为每个信号只开一个头寸?
而且,如果一个头寸在同一个柱子上被关闭(即信号仍然有效),那么新的头寸就不应该打开。
...然而,我怎样才能将其编程为每个信号只开一个头寸?
而如果在同一个柱子上的头寸被关闭(即信号仍然有效),那么新的头寸就不应该被打开。
如果订单的开仓时间,包括已关闭的订单,属于当前条形图(信号已出现的条形图),那么我们就在栅栏上吸烟。
大约如此。
bool flag=true; int cnt=OrdersTotal()-1; for(int i=cnt;i>=0;i--) { if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа flag=false; break; } } cnt=OrdersHistoryTotal()-1; for(i=cnt;i>=0;i--) { if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue; if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа flag=false; break; } } if(!flag) return;
如果存在这种情况,怎么可能同时有1个以上的职位空缺。
total=OrdersTotal();
if(total<1)
在EA中插入了你的代码。但结果还是一样。
我一定是把框架插错了。请审查。
外来的双倍Lots = 0.
1;
bool flag=true;
//+------------------------------------------------------------------+ //|
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1;
double st_m1, st_s1, st_m2, st_s2, Pivot,ma_s1;
int cnt, ticket, total;
if(Bars<100)
{
Print("bar less than 100");
return(0);
}
P_up0=iCustom(0,0, "Price channel",11,0,0);
P_down0=iCustom(0,0, "价格通道",11,1,0);
P_up1=iCustom(0,0, "价格通道",11,0,1);
P_down1=iCustom(0,0, "Price channel",11,1,1);
st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1) 。
st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2)。
Pivot=iCustom(0,0, "Pivot",0,1);
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//设置所有数据
total=OrdersTotal();
if(total<1)
{
//检查自由保证金
if(AccountFreeMargin()<(1000*Lots)
{
Print("We have no money.Free Margin = ", AccountFreeMargin());
return(0);
}
// BUY开仓 的条件
if(st_m2>st_s2&st_m1>st_s1&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alert("Purchase: " ,OrderOpenPrice());
}
else Alert("error:price " ,OrderOpenPrice());
return(0);
}
int cn=OrdersTotal()-1;
for(int i=cn;i>=0;i-) {
if( !OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 继续;
if(OrderOpenTime()>=Time[0]){ // Time[0] - 如果位置在当前符号的零条上打开
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY ) continue;
if(OrderOpenTime()>=Time[0]){ // Time[0] - 如果该位置是在当前符号的零条上打开的
flag=false;
break;
}
}
if(!flag) return;
//卖出头寸的条件
if(st_m2<st_s2&st_m1<st_s1&st_m2>75&&Pivot>)ma_s1)
{
ticket=OrderSend(Symbol(,OP_SELL,Lots,Bid,3,0,0,",0",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alert("Purchase: " ,OrderOpenPrice());
}
else Alert("error:price " ,OrderOpenPrice());
return(0);
}
int c=OrdersTotal()-1;
for(int a=c;a>=0;a-) {
if( !OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 继续;
if(OrderOpenTime()>=Time[0]){ // Time[0] - 如果位置在当前符号的零条上打开
flag=false;
break;
}
}
cnt=OrdersHistoryTotal()-1;
for(a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY ) continue;
if(OrderOpenTime()>=Time[0]){ // Time[0] - 如果位置在当前符号的零条上打开
flag=false;
break;
}
}
if(!flag) return;
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol() ==Symbol()
{
if(OrderType()==OP_BUY) //多头开仓
{
//关闭多头的条件
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(), Bid,3, Violet)
return(0);
}
}
else
{
//空头平仓条件
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
return(0);
}
}
return(0);
}
你误解了。不超过1个仓位同时打开!!!!!!! 信号出现--仓位打开。在同一零条上,价格向相反的方向发展,平仓的条件是有效的。在同一零条上,它被相应关闭。但信号动作并没有被取消。该位置再次打开和关闭,因为它的方向相反。
那么问题来了,如何让一个信号只开一个头寸,即使关闭时有一个新的刻度!?
在EA中插入了你的代码。但结果还是一样。
我一定是插入的代码不正确。
求你了,下次通过按钮粘贴代码 吧
应该不会有任何错误,但我还没有测试。
extern double Lots = 0.1; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double P_up0,P_down0,P_up1,P_down1; double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1; int i, cnt, ticket, total; bool flag=true; if(Bars<100) { Print("bars less than 100"); return(0); } // Проверяем стоит ли открываться cnt=OrdersHistoryTotal()-1; for(i=cnt;i>=0;i--) { if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue; if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа flag=false; break; } } cnt=OrdersTotal()-1; for(i=cnt;i>=0;i--) { if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа flag=false; break; } } if(!flag) return(0); //----------------------------------------------- P_up0=iCustom(0,0,"Ценовой канал",11,0,0); P_down0=iCustom(0,0,"Ценовой канал",11,1,0); P_up1=iCustom(0,0,"Ценовой канал",11,0,1); P_down1=iCustom(0,0,"Ценовой канал",11,1,1); st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1); st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1); st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2); st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2); Pivot=iCustom(0,0,"Pivot",0,1); ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1); //задали все данные // Проверка свободной маржи if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // Условие открытие позиции BUY if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Alert("Покупка: ",OrderOpenPrice()); } else Alert("ошибка:по цене ",OrderOpenPrice()); return(0); } // Условие открытие позиции SELL if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Alert("Покупка: ",OrderOpenPrice()); } else Alert("ошибка:по цене ",OrderOpenPrice()); return(0); } for(i=cnt;i>=0;i--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) {// длинная позиция открыта // условие закрытие длинной позиции if(P_down1>P_down0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return(0); } } else { // условие закрытия короткой позиции if(P_up1<P_up0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } } } } return(0); }
你好。编程专家可以提供帮助。
专家顾问:买入 - 在超卖区域(低于25)的随机指标和信号交叉,条件是
枢轴线低于价格水平(一种支持);相反,枢轴线高于价格水平。
测试显示了一些编程上的缺陷。1)如何在每个信号下只开一个交易(在测试过程中,我失去了一切,当信号仍然活跃(假),而平仓条件已经发生)。2)我是否正确设置了 "枢轴 "高于/低于价格水平的条件。 我有疑问,看了测试的图表。
如果我可以用具体的例子来帮助你。我对编程的了解停留在简单编译的水平上,!!!!!!!。
外置双Lots = 0.1。
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
双P_up0,P_down0,P_up1,P_down1。
double st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1;
int cnt, ticket, total;
如果(Bars<100)
{
Print("小于100的条形图")。
return(0);
}
P_up0=iCustom(0,0, "Price channel",11,0,0)。
P_down0=iCustom(0,0, "Price channel",11,1,0)。
P_up1=iCustom(0,0, "Price channel",11,0,1)。
P_down1=iCustom(0,0, "Price channel",11,1,1)。
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1)。
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1) 。
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2)。
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2) 。
Pivot=iCustom(0,0,Pivot,0,1)。
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1)。
//设置所有数据
total=OrdersTotal()。
如果(total<1)
{
// 检查自由保证金
如果(AccountFreeMargin()<(1000*Lots))
{
Print("我们没有钱。Free Margin = ", AccountFreeMargin();
return(0);
}
// BUY位置开放的条件
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,Green);
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY订单打开:",OrderOpenPrice())。
}
else Print("错误打开BUY订单:",GetLastError())。
return(0);
}
//打开卖出头寸条件
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,Red)。
如果(ticket>0)
{
如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("卖出订单 开仓:",OrderOpenPrice())
}
else Print("错误打开卖出订单:",GetLastError())。
return(0);
}
return(0);
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)。
如果(OrderType()<=OP_SELL &&)
OrderSymbol()==Symbol())
{
如果(OrderType()==OP_BUY)//多头开仓
{
// 多头平仓的条件
如果(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)。
return(0);
}
}
否则
{
// 空头头寸关闭的条件
如果(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)。
return(0);
}
}
}
}
return(0);
}