问吧! - 页 63

 

好的,我想出了枢轴的计算方法。谢谢你的帮助。

我现在面临的问题是,当它正确地在正确的价格位置打开挂单 时,每当价格行动移动1个点时,它就会继续重复打开挂单。

我已经寻找并将继续研究为什么会发生这种情况,但想看看你是否能给我一个提示或帮助,如果你看到我正在做的逻辑错误。

感谢你的时间。

extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.

extern int look_price_min = 35; // Offset in minutes when to look on price.

extern int close_hour = 12; // Close all orders after this hour

bool use_close_hour = true; // set it to false to ignore close_hour

int take_profit = 20;

extern int Currency_Spread = 4;

int open_long = 21;

int open_short = 21;

int stop_long = 30;

int stop_short = 30;

extern int slippage = 0;// Put what your brooker requires

extern double lots = 0.20; // Position size

extern int magic = 123;

bool clear_to_send = true;

void ReportStrategy()

{

int totalorders = HistoryTotal();

double StrategyProfit = 0.0;

double StrategyProfitOpen = 0.0;

int StrategyOrders = 0;

int StrategyOrdersOpen = 0;

for(int j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrders++;

StrategyProfit += OrderProfit();

}

}

}

totalorders = OrdersTotal();

for(j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrdersOpen++;

StrategyProfitOpen += OrderProfit();

}

}

}

Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",

StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",

"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));

return;

}

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

//| expert initialization function |

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

int init()

{

//----

ReportStrategy();

//----

return(0);

}

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

//| expert deinitialization function |

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

int deinit()

{

//----

//----

return(0);

}

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

//| expert start function |

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

int start()

{

ReportStrategy();

if(Hour() >= close_hour &&

use_close_hour){

// we are after closing time

int totalorders = OrdersTotal();

for(int j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

return(0);

}

if(Hour() == look_price_hour &&

Minute() >= look_price_min &&

clear_to_send){

// Probably I need to close any old positions first:

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

}

double PIVOT;

PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;

// Send orders:

OrderSend(Symbol(),

OP_BUYSTOP,

lots,

PIVOT+(open_long+Currency_Spread)*Point, // Spread included

slippage,

PIVOT+((open_long+Currency_Spread)-stop_long)*Point,

PIVOT+((open_long+Currency_Spread)+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

OrderSend(Symbol(),

OP_SELLSTOP,

lots,

PIVOT-open_short*Point,

slippage,

PIVOT-(open_short-stop_short)*Point,

PIVOT-(open_short+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

clear_to_send = false; // mark that orders are sent

if(!clear_to_send){ // there are active orders

int long_ticket = -1;

int short_ticket = -1;

bool no_active_order = true;

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUYSTOP)

long_ticket = OrderTicket();

if(OrderType() == OP_SELLSTOP)

short_ticket = OrderTicket();

if(OrderType() == OP_BUY ||

OrderType() == OP_SELL) // Active order

no_active_order = false; }

}

if(short_ticket == -1 && long_ticket != -1)

OrderDelete(long_ticket);

if(long_ticket == -1 && short_ticket != -1)

OrderDelete(short_ticket);

if(long_ticket == -1 && short_ticket == -1 && no_active_order &&

Hour() != look_price_hour && Minute() >= look_price_min)

clear_to_send = true;

if(Hour() == (look_price_hour-1) &&

MathAbs(Minute() - look_price_min) < 10)

clear_to_send = true;

}

//----

return(0);

}

 

关于我之前的帖子。

看起来 "clear_to_send = false; "在挂单 后没有切换。有什么想法吗?

一旦我把中枢作为挂单的参考点,就会发生这种情况。如果我不能解决这个逻辑问题,那么我想我将尝试找出如何从一个指标中引用一个枢轴,并从EA中调用它。

希望得到任何建议或帮助。

 

extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.

extern int look_price_min = 35; // Offset in minutes when to look on price.

extern int close_hour = 12; // Close all orders after this hour

bool use_close_hour = true; // set it to false to ignore close_hour

int take_profit = 20;

extern int Currency_Spread = 4;

int open_long = 21;

int open_short = 21;

int stop_long = 30;

int stop_short = 30;

extern int slippage = 0;// Put what your brooker requires

extern double lots = 0.20; // Position size

extern int magic = 123;

bool clear_to_send = true;

void ReportStrategy()

{

int totalorders = HistoryTotal();

double StrategyProfit = 0.0;

double StrategyProfitOpen = 0.0;

int StrategyOrders = 0;

int StrategyOrdersOpen = 0;

for(int j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrders++;

StrategyProfit += OrderProfit();

}

}

}

totalorders = OrdersTotal();

for(j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrdersOpen++;

StrategyProfitOpen += OrderProfit();

}

}

}

Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",

StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",

"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));

return;

}

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

//| expert initialization function |

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

int init()

{

//----

ReportStrategy();

//----

return(0);

}

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

//| expert deinitialization function |

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

int deinit()

{

//----

//----

return(0);

}

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

//| expert start function |

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

int start()

{

ReportStrategy();

if(Hour() >= close_hour &&

use_close_hour){

// we are after closing time

int totalorders = OrdersTotal();

for(int j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

return(0);

}

if(Hour() == look_price_hour &&

Minute() >= look_price_min &&

clear_to_send){

// Probably I need to close any old positions first:

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

}

double PIVOT;

PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;

// Send orders:

if (clear_to_send){

OrderSend(Symbol(),

OP_BUYSTOP,

lots,

PIVOT+(open_long+Currency_Spread)*Point, // Spread included

slippage,

PIVOT+((open_long+Currency_Spread)-stop_long)*Point,

PIVOT+((open_long+Currency_Spread)+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

OrderSend(Symbol(),

OP_SELLSTOP,

lots,

PIVOT-open_short*Point,

slippage,

PIVOT-(open_short-stop_short)*Point,

PIVOT-(open_short+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

clear_to_send = false; // mark that orders are sent

}

if(!clear_to_send){ // there are active orders

int long_ticket = -1;

int short_ticket = -1;

bool no_active_order = true;

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUYSTOP)

long_ticket = OrderTicket();

if(OrderType() == OP_SELLSTOP)

short_ticket = OrderTicket();

if(OrderType() == OP_BUY ||

OrderType() == OP_SELL) // Active order

no_active_order = false; }

}

if(short_ticket == -1 && long_ticket != -1)

OrderDelete(long_ticket);

if(long_ticket == -1 && short_ticket != -1)

OrderDelete(short_ticket);

if(long_ticket == -1 && short_ticket == -1 && no_active_order &&

Hour() != look_price_hour && Minute() >= look_price_min)

clear_to_send = true;

if(Hour() == (look_price_hour-1) &&

MathAbs(Minute() - look_price_min) < 10)

clear_to_send = true;

}

//----

return(0);

}

试试这个代码吧。

 

Ryanklefas ,

你在这一领域的表现非常出色。

我根据你的修改所做的测试成功了。

不知道为什么添加枢轴逻辑会干扰到当前的 "如果 "逻辑。我可能需要在不同的地方建立枢轴代码。然而,我看到你是如何隔离挂单 代码的,到目前为止是有效的。

谢谢你给我指出的代码例子的网址。在我提高编程技能时,这将是一个很好的资源。

我发现,解决一个问题有时会引起另一个问题,这很有趣/令人沮丧。

目前的问题。我现在需要找出为什么这段代码只允许5位数而不是3位数的价格挂单。

例如:1.1234可以正常工作,但1.12会出现错误,即1.123333不是OrderSend的有效价格。

所以它对英镑/美元有效,但对美元/日元无效。

再次感谢您的时间。

 
proverbs:
汇率。

你在这一领域的表现非常出色。

谢谢你。

至于你的问题。

确保在你向orderSend函数发送枢轴值之前,你已经用NormalizeDouble函数 将其规范化 了;使用预设值 "Digits "作为第二个参数,将双数四舍五入到你的货币的适当位数。

 
waaustin:
我的问题是如何将计算出的数值四舍五入到最接近的小数位。

我认为normalizeDouble函数 也能为你工作。 我也见过使用MathFloor和MathCeiling函数来完成同样的事情的代码。

 

另一个帮助

谁能告诉我怎么做?

附加的文件:
chart.gif  18 kb
 
hellkas:
谁能告诉我怎么做?

我认为这与这个主题有关https://www.mql5.com/en/forum/176969

 

在代码中设置级别的颜色

谁能告诉我如何设置level1 30为绿色,level2 70为红色?

#属性 indicator_separate_window

#属性 indicator_buffers 1

#属性 indicator_color1 DodgerBlue

#属性 indicator_level1 30

#属性 indicator_level2 70

#属性 indicator_minimum 0

#属性 indicator_maximum 100

谢谢你

 
highway3000:
谁能告诉我如何将level1 30设置为绿色,leve2 70设置为红色?

#属性 indicator_separate_window

#属性 indicator_buffers 1

#属性 indicator_color1 DodgerBlue

#属性 indicator_level1 30

#属性 indicator_level2 70

#属性 indicator_minimum 0

#属性 indicator_maximum 100

预先感谢

我想MetaEditor的这一部分会是你要找的东西。

MQL4参考 - 基础知识 - 预处理程序 -控制 编译

原因: