任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 1067

 

请帮助我!有2个文件:一个指标和一个专家顾问。如何通过#include正确引用指标中的函数? 由于各种原因,iCustom并不适合。这是我在指标中写的。

bool BuyTrue(double& переменная, int переменная) export
{
   //тело функции

   return(true);
}   

而这是我在专家顾问中写的内容。

#import "НазваниеИндикатора.ex4"
   bool BuyTrue(double& переменная, int переменная);
if (BuyTrue(переменная, переменная))
Opn_B = true;

但由于某些原因,专家顾问没有工作,在测试 过程中,指标 没有出现在价格图表中。我写得对吗?如果有错,错在哪里?

 
AlexeyVik:

图塔。


我没有。但肯定有一个文件在某处,我从它那里得到记录的信息。


 

请帮助我编译到mt4上

FileClose'--'void'类型的表达是非法的 TickToCVS~.mq4 84 12

附加的文件:
 
abeiks:

我没有。但肯定有一个文件在某处,我从里面得到了记录的信息。


我的截图显示菜单来自MetaEditor,而你的截图是来自MT。
 
AlexeyVik:

这就是EMPTY_VALUE值

寻找它出现的地方。

谢谢你。你已经帮助我解决了这个问题。我的指标在加载时,从第一个条形开始计算,而不是从零开始计算(我是故意的),在零点时,它是根据刻度历史 计算的,而不是根据历史数据。现在,当我改变时间框架,将其附加到图表上并重新启动终端时,我在条形图0上将缓冲区数值重置为零,问题解决了。
 
AlexeyVik:
我的截图显示菜单来自MetaEditor,而你的截图是来自MT。
对了!谢谢你!
 
如果该订单已被触发,我怎样才能在历史中获得订单的开盘价,而不是未结头寸的价格?在所附的函数中,如果一个订单已经触发,这个订单只能在头寸中找到,所以它不起作用。而在头寸中,我们只有未结 头寸的价格,而没有订单的价格。
double GetPriceLastCloseOrder(string sy="", int mn=-1) {
  datetime t=0;
  int      i, k=OrdersHistoryTotal(); 
  double r=0;

  if (sy==NULL) sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()>1 && OrderType()<6) {
          if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            r=OrderOpenPrice();
          }
        }
      }
    }
  }
  return(r);
}  
 

大家好,我的问题是,我不能修改一个订单。 有两个方面,我不明白修改的数学原理,请给我解释。

在我看来,SL= IF ORDERSELEKT,Bid-ORDERSTOPLOS*POINT,DIGITS

第二方面。从XBMS视频中了解到的情况

我没有尝试在测试器中改变变量的值,因为130没有正确的止损和这样的狗屎。

2016.06.28 21:42:23.402 2016.06.23 00:00 交易RSI输入:Lots=0.1; Slippage=5; StopLoss=10; TakeProfit=30; RSIPeriod=7; Magic=1087。

虽然有一个从数字和函数的乘法的情况下,错误的SL


外置双Lots = 0.1。

外来的int Slippage = 10;

外来的int StopLoss = 10;

外置 int TakeProfit =30;

外部int RSIPeriod = 7;

外来int Magic =1087;

双重MaRSI。


int TP,SL;

bool tfu;


//+------------------------------------------------------------------+

//|专家初始化功能|

//+------------------------------------------------------------------+

int OnInit()

{

如果(Digits == 3||Digits == 5)

{

滑移*=10。

TakeProfit *= 10。

StopLoss *= 10;

}

return(INIT_SUCCEEDED)。

}

//+------------------------------------------------------------------+

//|专家去初始化函数|

//+------------------------------------------------------------------+

空白的OnDeinit(const int reason)。

{


}

//+------------------------------------------------------------------+

//|专家勾选功能|

//+------------------------------------------------------------------+

空白的OnTick()

{

//+------------------------------------------------------------------+

//开放销售

//+------------------------------------------------------------------+

MaRSI=iRSI(Symbol(),0, RSIPeriod,PRICE_CLOSE,1)。

如果(CountTrades() <= 0&MaRSI<=30 )

{

如果( SendOrder(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0, "test",Magic,0,Green)

{ int ticket = OrderTicket();

SL = NormalizeDouble( Ask - StopLoss*Point,Digits);

TP = NormalizeDouble( Ask + TakeProfit*Point,Digits)。

ModifyOrder(ticket,OrderOpenPrice(),SL,TP,0,Black)。

}

}//如果(CountTrades <= 0&MaRSI>=70 )

//+------------------------------------------------------------------+

//开放购买

//+------------------------------------------------------------------+


}//ONTICK


//+------------------------------------------------------------------+

//+订单计数器

//+------------------------------------------------------------------+


int CountTrades ()

{

int count = 0。

for(int i = OrdersTotal()-1;i>=0;i--)

{

if( OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)//如果该订单是我们的

count++;//增加计数器

}//按索引选择顺序

}// order.i===================第一顺序。

return(count);//返回订单的数量。

}//功能

//+------------------------------------------------------------------+

//具有错误处理功能的订单放置功能

//+------------------------------------------------------------------+

int SendOrder( string symbol,int cmd,double volume,double price,int slippage,double stoploss,

double takeprofit,string comment,int magic=0,datetime expiration=0,color arrow_color=CLR_NONE)

{

int err = GetLastError()。

err =0。

bool exit_cikl = false。

int ticket = -1;

int Retry = 10; //尝试设置一个订单的次数

int cnt = 0; //try count

如果(cmd == OP_BUY || cmd == OP_SELL)

{

while(!exit_cikl)

{

ticket = OrderSend(symbol,cmd,volume,price,slipage,stoploss,takeprofit,comment,magic,expiration,arrow_color);

err= GetLastError()。

switch(err)

{

case ERR_NO_ERROR:

exit_cikl = true。

突破。

{ case ERR_SERVER_BUSY:

case ERR_NO_CONNECTION:

case ERR_INVALID_PRICE:

case ERR_OFF_QUOTES:

case ERR_BROKER_BUSY:

case ERR_TRADE_CONTEXT_BUSY:

cnt++。

突破。

case ERR_PRICE_CHANGED:

case ERR_REQUOTE:

RefreshRates()。

继续。

默认情况下。

exit_cikl = true。

突破。

}// switch switch(err)

如果(cnt > Retry)

exit_cikl = true。

if(!exit_cikl)

{

睡眠(1000)。

RefreshRates()。

}//如果我们不退出循环 if(!exit_cikl)

否则

{

if(err != ERR_NO_ERROR)

{

Print("Error : " + IntegerToString(err))。

}//如果仍然有错误 if(err != ERR_NO_ERROR)

}//其他

如果(err==ERR_NO_ERROR)

{

如果( OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) ==true)

return(ticket)。

}// 如果(err==ERR_NO_ERROR)

Print("Error opening order after " + IntegerToString(cnt) +"attempts");

返回(-1)。

} //循环,而

}//如果订单类型是买或卖

return(ticket)。

}//SendOrder函数


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

//修改订单的功能

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

修改订单(int ticket,double price,double stoploss,double takeprofit,datetime expiration,color arrow_color)

{

如果(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

{

price = NormalizeDouble(price,Digits);

stoploss = NormalizeDouble(stoploss,Digits);

takeprofit = NormalizeDouble(takeprofit,Digits)。

CheckValidStop(Symbol(),price,stoploss);//改变最小止损的函数。

int err = GetLastError()。

err = 0 ;

int Retry = 10;

int cnt = 0。

bool exit_cikl = false。

bool result。

while(!exit_cikl)

{

结果 = OrderModify(ticket, price,stoploss,takeprofit,expiration, arrow_color)。

err = GetLastError()。

if(result == true)

{

Print("Order #"+ IntegerToString(ticket), "successful modified");

return(true)。

}

switch(err)

{

case ERR_NO_ERROR:

exit_cikl = true。

突破。

{ case ERR_SERVER_BUSY:

case ERR_NO_CONNECTION:

case ERR_INVALID_PRICE:

case ERR_OFF_QUOTES:

case ERR_BROKER_BUSY:

case ERR_TRADE_CONTEXT_BUSY:

cnt++。

突破。

case ERR_PRICE_CHANGED:

case ERR_REQUOTE:

RefreshRates()。

继续。

默认情况下。

exit_cikl = true。

突破。

}// switch switch(err)

}// while(!exit_cikl)

if ( err != ERR_NO_ERROR)

{

Print("Error modifying order # " + IntegerToString(ticket))。

Print("错误代码。" + IntegerToString(err))。

}

}//(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

否则

{

Print("Order selection failed, ticket = " + IntegerToString(ticket));

return(false)。

}//如果出了问题

return(true)。

}//函数修改

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

//ChtckValidStop

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

空白 检查有效止损(string symbol,double price,double& sl)

{

如果(sl==0)

返回。

double min_stop_server = MarketInfo(symbol,MODE_STOPLEVEL)*MarketInfo(symbol,MODE_POINT)。

如果(MathAbs(price-sl) <= min_stop_server)

{

如果(价格>sl)

sl = 价格 - min_stop_server。

否则sl = sl + min_stop_server。

}// 如果(MathAbs(price-sl) <= min_stop_server)

sl = NormalizeDouble(sl,MarketInfo(symbol,MODE_DIGITS))

}//功能


 

交易历史中有两个订单:1) SELL № tic 415 STOPLOSS 1.1000 lot 0.01 2) SELL № tic 418 STOPLOSS 1.1000 lot 0.02

我必须指定变量X=tick,Y=STOPLOSS和B=lot,如果Asc价格等于卖出订单的STOPLOSS。如何将第一个值分配给第一阶,然后再分配给第二阶。对我来说,它总是给第一个订单分配一个值。

 
m8akca:

交易历史中有两个订单:1) SELL № tic 415 STOPLOSS 1.1000 lot 0.01 2) SELL № tic 418 STOPLOSS 1.1000 lot 0.02

我必须指定变量X=tick,Y=STOPLOSS和B=lot,如果Asc价格等于卖出订单的STOPLOSS。如何将第一个值分配给第一阶,然后再分配给第二阶。对我来说,它总是给第一个订单分配一个值。

这个话题是为了帮助那些已经写好东西的人,但它并不像我希望的那样运作。请提交你的代码,以便这里的其他人能够看到问题所在并提供帮助。

如果你想按顺序写,这就是它的位置

原因: