向鉴赏家提问

 

你好。编程专家可以提供帮助。

专家顾问:买入 - 在超卖区域(低于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);
}




附加的文件:
pivot.mq4  2 kb
 
Kostay:

你好。编程专家可以提供帮助。

专家顾问:买入 - 在超卖区域(低于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);
     }
 
我在同一个地方失去了我的全部存款!
 

我还是不明白我在这段代码中改变了什么。它似乎是一样的!

还有,我怎样才能把它编程为每个信号只开一个头寸?

而且,如果一个头寸在同一个柱子上被关闭(即信号仍然有效),那么新的头寸就不应该打开。

 
Kostay:

...然而,我怎样才能将其编程为每个信号只开一个头寸?

而如果在同一个柱子上的头寸被关闭(即信号仍然有效),那么新的头寸就不应该被打开。

如果订单的开仓时间,包括已关闭的订单,属于当前条形图(信号已出现的条形图),那么我们就在栅栏上吸烟。

大约如此。

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);
}




 
D500_Rised:

如果存在这种情况,怎么会有1个以上的职位同时开放。

total=OrdersTotal();
if(total<1)

?

你误解了。不超过1个仓位同时打开!!!!!!! 信号出现--仓位打开。在同一零条上,价格向相反的方向发展,平仓的条件是有效的。在同一零条上,它被相应关闭。但信号动作并没有被取消。该位置再次打开和关闭,因为它的方向相反。

那么问题来了,如何让一个信号只开一个头寸,即使关闭时有一个新的刻度!?

 
然后你需要对酒吧内的贸易进行禁止,用这些关键词去搜索,你会发现它。
 
Kostay:

在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);
}
 

专家顾问现在发生了一件奇怪的事情,它在关闭头寸 时不工作。而结果是:一切都输在了同一个问题上,尽管是修改过的版本!