我可以使用extern变量来设置要运行的EA的符号吗?

[已删除]  

嗨,大家好。我有个问题。

我正在开发EA,其想法是将要运行EA的符号作为输入参数。

我虽然在组合框上,但我知道mql4不允许组合框。我对吗?

我正在尝试使用外部字符串变量。但是由于错误4106(未知符号),它没有发送任何订单。

extern string symbol = "美元加元";
...

OrderSend(symbol,  ... ,  ... );

我也试过 使用StringConcatenate 穿上"

extern symbol = "美元加元";

start()
{
   string orderSymbol = StringConcatenate("\"", symbol, "\"");
   OrderSend(orderSymbol,  ... ,  ... );
}

但是仍然是同样的错误。有谁能够帮助我?还是无法将符号设置为输入参数?

谢谢。

没有人有权审判另一个人
237
没有人有权审判另一个人 2012.07.12 19:42:42  
您可以将符号作为外部传递,但是,该符号必须与经纪人提供的可用符号匹配。您的经纪人是否偶然使用USDCADn或某种变体?
[已删除] 2012.07.12 19:57:50  

嗨,蛇王。

不,经纪人使用USDCAD。我做了一些测试。我将符号定义为不是外部变量,而是局部变量:

start
{
   string symbol = "美元加元";
   OrderSend(symbol,  ... ,  ... );
}

而且效果很好。但是当它的外部变量时,我总是得到相同的错误(4106)。我不知道问题出在哪里。

没有人有权审判另一个人
237
没有人有权审判另一个人 2012.07.12 20:55:55  

创建并运行此脚本,并告诉我们您得到了什么 美元加元 chart (未试)

#property show_inputs

extern string symbol = "美元加元"; 

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   Print(Symbol()," / ",symbol," / ",(Symbol() == symbol));
   return(0);
  }
[已删除] 2012.07.12 22:14:05  
蛇黑:

创建并运行此脚本,并告诉我们您在USDCAD图表上得到了什么(未经测试)


在专家日志中运行脚本,这正是我得到的:

test 美元加元, H1: loaded successfully

测试USDCAD,H1输入:symbol ="USDCAD";

test 美元加元, H1: 美元加元/ 美元加元/ 1

test 美元加元, H1: uninit reason 0

test 美元加元, H1: removed

[已删除] 2012.07.12 23:04:46  

我最好告诉您EA的概念,以及为什么我要问要使用符号的extern变量。也许我以前的错误有解决方案。

这个想法是用10个或更多不同的符号运行相同的EA。

但是,我需要的是EA每个符号仅执行2个订单。但是订单不能是2卖或2买。如果同一符号中有2个订单,则它们只能是1个卖出和1个买入。

这是我的代码:

start
{
   if(existSell() == false)
   {
      OrderSend(Symbol(),  ... ,  ... );
   }
   
   if(existBuy() == false)
   {
      OrderSend(Symbol(),  ... ,  ... );
   }
}

bool existSell()
  {
      bool exist = false;
      bool  结束  = false;
      for(int i = 0; i < OrdersTotal() &&  结束  == false; i++)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol())
            {
               if(OrderType() == OP_SELL || OrderType() == OP_SELLSTOP)
               {
                  exist = true;
                  end = true;
               }
            }
         }
      }
      return(exist);
   }
     
          
   bool existeOrdenBuy()
  {
      bool exist = false;
      bool  结束  = false;
      for(int a = 0; a < OrdersTotal() &&  结束  == false; a++)
      {
         if(OrderSelect(a, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol())
            {
               if(OrderType() == OP_BUY || OrderType() == OP_BUYSTOP)
               {
                  exist = true;
                  end = true;
               }
            }
         }
      }
      return(exist);
   }            

如果我仅在1个符号中使用此代码,则该代码工作正常。但是,如果运行量更大,它并不会执行它应该执行的所有命令。使用此代码,每个符号仅执行1个顺序。而且我不知道为什么。

这就是为什么我想进行编码,以便EA可以准确地找到符号中是否有订单。因此它可以完美地执行订单。

希望您能帮助我,我会非常感激。

顺便说一下,这还不是EA完整的。抱歉,我可以告诉您它必须使用的所有过滤器。

没有人有权审判另一个人
237
没有人有权审判另一个人 2012.07.13 02:56:39  

好吧,您是否总是会卖出而不是买入?

发送第二笔订单时河北体彩环境可能很忙吗?

[已删除] 2012.07.13 05:12:32  

其实我可以买卖。但是永远不要同时使用相同的符号。

我的河北体彩环境很忙,但这仅是为了修改订单,这是我遇到的另一个问题,但我想先解决订单的执行问题。

[已删除] 2012.07.13 06:38:16  

在将USDCAD声明为外部变量之后,您要将EA附加到哪个符号图?

 乌布岑
5301
乌布岑 2012.07.13 06:40:50  

我要做的是写小分配 职能 可以重复使用。它有助于减少开发时间。以下是我的一些例子"for testing"模板。您需要在实时图表上使用以下类似内容之前,先添加错误检查功能。只是示例,未经测试。

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
extern string  My_Symbs="EURUSD_USDJPY_GBPUSD_USDCHF_AUDUSD_USDCAD";
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void start(){
    string  Symbol_Ray[]={"EURUSD","USDJPY","GBPUSD","USDCHF","AUDUSD","美元加元"};
    int Temp_Magic=7; int Fx__Period; string  Fx__Symbol;
    for(int i=0; i<ArraySize(Symbol_Ray); i++){
        Fx__Symbol=Symbol_Ray[i]; Fx__Period=PERIOD_M1;
        if(StringFind(My_Symbs,Fx__Symbol)<0){continue;}
        if(IsTesting()){i=9999; Fx__Symbol=Symbol();}
        Origination_Algorithm_OrderSend(Temp_Magic,Fx__Symbol,Fx__Period);
        Termination_Algorithm_OrderClse(Temp_Magic,Fx__Symbol,Fx__Period);
}   }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Origination_Algorithm_OrderSend(int Magic, string Symb, int Perd){
    MathSrand(GetTickCount()); int Direction;
    if(MathRand()%2==0){Direction=1;}else{Direction=-1;}
    for(int x=1; x>=-1; x-=2){
        if(Direction!=x){continue;}
        if(Count_Orders_Magic_Symbol_Type(Magic,Symb,x)>0){continue;}
        double Lot= 市场 Info(Symb,MODE_MINLOT); 
        double Ask_Market=      市场 Info(Symb,MODE_ASK);
        double Bid_Market=      市场 Info(Symb,MODE_BID);
        double OrPrice; color OrColor;
        if(x== 1){OrPrice=Ask_Market; OrColor=Blue;}
        if(x==-1){OrPrice=Bid_Market; OrColor=Red;}
        OrderSend(Symb,Ot(x),Lot,OrPrice,0,0,0,"",Magic,0,OrColor);
}   }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Termination_Algorithm_OrderClse(int Magic, string Symb, int Perd){
    for(int x=1; x>=-1; x-=2){
        int Time_X=TimeLst_Order_Magic_Symbol_Type(Magic,Symb,x);
        double Prof=Profit_Order_Magic_Symbol_Type(Magic,Symb,x);
        if(Time_X>iTime(Symb,Perd,60) && Prof<1){continue;}
        while(Count_Orders_Magic_Symbol_Type(Magic,Symb,x)>0){
            Close_Orders_In_Type_Priority(Magic,Symb,x);
}   }   }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int Count_Orders_Magic_Symbol_Type(int Magic, string Symb, int x){
    int Ans; for(int i=OrdersTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS)
        && OrderMagicNumber()==Magic
        && OrderSymbol()==Symb
        && OrderType()==Ot(x)){Ans++;}} return(Ans);}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int TimeLst_Order_Magic_Symbol_Type(int Magic, string Symb, int x){
    for(int i=OrdersTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS)
        && OrderMagicNumber()==Magic
        && OrderSymbol()==Symb
        && OrderType()==Ot(x)){return(OrderOpenTime());}}}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double Profit_Order_Magic_Symbol_Type(int Magic, string Symb, int x){
    double Ans; for(int i=OrdersTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS)
        && OrderMagicNumber()==Magic
        && OrderSymbol()==Symb
        && OrderType()==Ot(x)){Ans+=OrderProfit();}} return(Ans);}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int Ot(int Value){if(Value==1){return(0);}if(Value==-1){return(1);}}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bool Close_Orders_In_Type_Priority(int Magic, string Symb, int Type){
    double LargeLot; int LargeTicket;
    for(int i=OrdersTotal()-1; i>=0; i--){
        if(OrderSelect(i, SELECT_BY_POS)
        && OrderMagicNumber()==Magic 
        && OrderSymbol()==Symb){
            if(OrderType()==Ot(Type)){
            if(OrderLots()>LargeLot){
                LargeLot=OrderLots(); LargeTicket=OrderTicket();}}}
    }Close_Order_With_Matchin_Ticket(LargeTicket);}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bool Close_Order_With_Matchin_Ticket(int Ot){
    if(OrderSelect(Ot, SELECT_BY_TICKET) && OrderCloseTime()==0){
        double Ocp=OrderClosePrice(); double Ol=OrderLots();
        if(!IsTesting()){while(IsTradeContextBusy()){Sleep(500);}}
        int Ans=OrderClose(Ot,Ol,Ocp,0,0); return(Ans);}}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
西蒙·尼亚德科夫斯基
17343
西蒙·尼亚德科夫斯基 2012.07.13 06:48:32  
wimpy63 :

我最好告诉您EA的概念,以及为什么我要问要使用符号的extern变量。也许我以前的错误有解决方案。

这个想法是用10个或更多不同的符号运行相同的EA。

但是,我需要的是EA每个符号仅执行2个订单。但是订单不能是2卖或2买。如果同一符号中有2个订单,则它们只能是1个卖出和1个买入。

这是我的代码:

如果我仅在1个符号中使用此代码,则该代码工作正常。 但是,如果运行量更大,它并不会执行它应该执行的所有命令。使用此代码,每个符号仅执行1个顺序。而且我不知道为什么。

这就是为什么我想进行编码,以便EA可以准确地找到符号中是否有订单。因此它可以完美地执行订单。

希望您能帮助我,我会非常感激。

顺便说一下,这还不是EA完整的。抱歉,我可以告诉您它必须使用的所有过滤器。

您说您在多个河北体彩品种上运行此EA,是否也在相同的河北体彩品种上但在不同的时间框架上运行它?例如,GBPUSD H1& GBPUSD M15 ?

也许您的第二个订单正在打开,但是它们很快关闭了,您检查了吗?

一点无关紧要。 。 。摆脱你的 结束 变量,只需使用 打破 代替。

if(OrderType() == OP_BUY || OrderType() == OP_BUYSTOP)
               {
                  exist = true;
                   打破 ;         //  <--  exits the loop
               }