专家顾问 - 杂项问题 - 页 8 123456789101112131415...43 新评论 Marco vd Heijden 2016.12.09 09:37 #71 好的,所以如果你用 int stoploss=50;double stop; stop=stoploss*Point();Print(DoubleToString(stoploss));通过使用Point()函数,应该可以得到你的止损值,然后你必须从买入价和卖出价中分别加上或减去该值,以得到你的止损价格水平。同样的方法也适用于获利,当然是相反的。你可以查看代码库中的一些EA,那里有很多例子和变化,说明编码员如何在他们的EA中做这些事情。例如,这里有一个叫做 "拖曳大师 "的例子https://www.mql5.com/en/code/16136//-------------------------------------------------------------------------// 1. Main function//-------------------------------------------------------------------------void OnTick(void) { Comment("Copyright © 2016, Il Anokhin\n"+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));//--- 1.1. Define pip ----------------------------------------------------- if(Digits==4 || Digits<=2) pip=Point; if(Digits==5 || Digits==3) pip=Point*10;//--- 1.2. Trailing ------------------------------------------------------- for(i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { if(OrderSymbol()==Symbol() && TS>0 && OrderProfit()>0) { if(UC==true && OrderComment()==Comm && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0); if(UC==true && OrderComment()==Comm && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0); if(UC==true && OrderComment()==Comm && UM==false && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0); if(UC==true && OrderComment()==Comm && UM==false && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0); if(UC==false && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0); if(UC==false && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0); if(UC==false && UM==false && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0); if(UC==false && UM==false && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0); } } }//--- 1.3. End of main function -------------------------------------------在这里你可以看到编码员Il Anokhin用 拳头定义点。但这里是另一个名为E-smart trailing的例子,来自Димаhttps://www.mql5.com/en/code/8674 //+------------------------------------------------------------------+void ModifyStopLossInPoint(int stoploss){bool result;double sl = 0;double point = MarketInfo(OrderSymbol(),MODE_POINT);if (OrderType() == OP_BUY) sl = OrderOpenPrice() + stoploss * point;if (OrderType() == OP_SELL) sl = OrderOpenPrice() - stoploss * point; result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,CLR_NONE);if (result && UseSound) PlaySound(var_132);}//+------------------------------------------------------------------+注意到做事时的细微差别。我总是尝试各种东西,直到我找到最有效的东西。 Trailing Master 投票: 112016.10.27Il Anokhinwww.mql5.com The Expert Advisor that performs order trailing after reaching certain profit. expert advisor - miscellaneous 任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. 如何编码? Max Enrik 2016.12.09 09:46 #72 Marco vd Heijden:好的,所以如果你用...Omg,只是快速检查出 惊人的感谢一切之前,我开始阅读和尝试的东西。我将很快尝试。再一次深深感谢@Marco vd Heijden Max Enrik 2016.12.10 05:54 #73 Marco vd Heijden: 对象是相互堆叠的,所以让chartevent()知道在什么按钮上的点击或对象比其他可能重叠的对象 具有最高的优先权很重要。非常感谢,我喜欢你的评论,你的评论 更清楚,更有用。祝你一切顺利。 Max Enrik 2016.12.10 14:17 #74 Marco vd Heijden:好吧,如果你使用 int stoploss=50;我总是尝试各种方法,直到我找到最有效的方法。我只是想理解你的评论,然后为我的订单、止损和止盈功能写一些好的代码--谢谢你。所以,我已经尝试了类似下面的代码,我需要确定 欧元兑美元和FB的止损值 都是正确的,为10点?(如果你想知道我在想什么--只是我认为是的,下面的日志/结果都是10点的正确值。) 例如: stoploss value = 10; Position - BUY log: EURUSD | 价格(ask): 1.05633/ 止损: 1.05533 log: FB | 价格(ask): 119.69/ 止损: 119.59( 我通过void OnChartevent()调用下面的函数 )// this part of code from OnChartEvent()//---if ( sparam == _buy_name_btn ){ ObjectSetInteger( 0, sparam, OBJPROP_STATE, false ); _Buy_calc_SL_TP(); Print( " | Click Verify / ");}//---return;void _Buy_calc_SL_TP(){ //--- if ( _StopLoss_ON == true ) { //_Sl = OrderOpenPrice() - _StopLoss * _Pip; _Sl = Ask - _StopLoss * _Pip; Print( " | Buy Calc SL TP Function / StopLoss: ", _Sl ); } //--- return;} expert advisor - miscellaneous 编码帮助......我如何让指标过滤而不是警报? 问吧! Marco vd Heijden 2016.12.10 16:01 #75 似乎是在工作。 Max Enrik 2016.12.11 05:27 #76 我将尝试把威廉先生 的意见纳入EA的代码中--再次感谢威廉。伟大的Pip的计算MQL4(请不要责怪我,因为这个代码行业对我来说非常广泛,有时我失去了理智--无论如何,我希望我能尽快完成我的贸易面板EA的代码)我将在完成后分享我的测试EA的代码,以了解该代码是否良好/正确或什么?(因为我不是专业的编码/程序员 - 我正在努力 - )。 Max Enrik 2016.12.11 05:37 #77 Keith Watford:好吧,很公平。我懒得读你的一些帖子,因为它伤害了我的眼睛。 如果其他人有同样的感觉,那么是你们错过了,不是我。 我不知道你的这个名字。我只知道你像一个@Gumrai,所以对不起,我对你的评论有点生气。所以你在我的代码知识为零的时候帮我做了这个评论。没有问题,可以忽略我所有的评论,需要帮助或其他的东西。但我只需要为我对你的愤怒回答道歉。 Max Enrik 2016.12.11 13:40 #78 市场已经关闭,我也不清楚其他的事情。但我尝试了下面的代码,我觉得我错过了什么,但我找不到。(我想说的是,我的贸易面板 EA有买入和卖出的代码,但我想用手写出来,我确定这个EA是如何工作的)提前感谢您的帮助和建议。#define CHANGE double ///< Difference of two prices.#define POINT int ///< `CHANGE / _Point`.#define PIP double ///< `POINT / PipsPerPOINT`. CHANGE points_to_change(POINT n){ return n * _Point ;} POINT change_to_points(CHANGE c){ return POINT(c / _Point + 0.5) ;} CHANGE pips_to_change (PIP n){ return points_to_change(pips_to_points(n));} PIP change_to_pips (CHANGE c){ return points_to_pips(change_to_points(c));} POINT pips_to_points (PIP n){ if( (_Digits&1) == 1) n *= 10.0; return POINT(n);} PIP points_to_pips (POINT n){ PIP p = n; if( (_Digits&1) == 1) p /= 10.0; return p;}string prfx = "test" ;string sellbutton = prfx + "sell" ;string sounduse = "tick.wav" ;int stoploss = 10 ;int takeprofit = 10 ;int magic = 12345 ;int ticket = 0 ;int slippage = 3 ;double lot = 0.01 ;double sl ;bool stoploss_on = true ;bool result ;bool sound_use = true ;//---//---int OnInit(){ ObjectCreate ( 0, sellbutton, OBJ_BUTTON , 0, 0, 0 ); ObjectSetString ( 0, sellbutton, OBJPROP_TEXT , "Sell" ); ObjectSetInteger ( 0, sellbutton, OBJPROP_XDISTANCE , 20 ); ObjectSetInteger ( 0, sellbutton, OBJPROP_YDISTANCE , 20 ); ObjectSetInteger ( 0, sellbutton, OBJPROP_XSIZE , 80 ); ObjectSetInteger ( 0, sellbutton, OBJPROP_YSIZE , 40 ); ObjectSetInteger ( 0, sellbutton, OBJPROP_CORNER , CORNER_LEFT_UPPER ); ObjectSetInteger ( 0, sellbutton, OBJPROP_COLOR , clrWhite ); ObjectSetInteger ( 0, sellbutton, OBJPROP_BGCOLOR , clrMaroon ); ObjectSetInteger ( 0, sellbutton, OBJPROP_STATE , false ); ObjectSetInteger ( 0, sellbutton, OBJPROP_ZORDER , 1 ); Print( "ObjectsTotal: ", ObjectsTotal() ); return(0);}//---//---void OnTick(){ //--- //--- return;}//---//---void OnDeinit(const int reason){ //--- ObjectsDeleteAll( 0, prfx ); //--- return;}//---//---void OnChartEvent(const int id , const long& lparam , const double& dparam , const string& sparam ){ // Sell if ( sparam == sellbutton ) { ObjectSetInteger( 0, sparam, OBJPROP_STATE, false ); ticket = Orderfuntions( sellbutton ); } return;}//---//---void SellCalcSLTP(){ //--- if ( stoploss_on == true ) { if ( OrderType() == OP_SELL ) sl = OrderOpenPrice() - pips_to_change( stoploss ); if ( OrderType() == OP_BUY ) sl = OrderOpenPrice() + pips_to_change( stoploss ); result = OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, CLR_NONE ); if ( result && sound_use ) PlaySound( sounduse ); } //--- return;}//---//---int Orderfuntions( string _Order_selector ){ // Sell Order SellCalcSLTP(); if ( _Order_selector == sellbutton ) { ticket = OrderSend( _Symbol, OP_SELL, lot, Bid, slippage, sl, takeprofit, "comment", magic, 0, clrMaroon ); } return(ticket);} expert advisor - miscellaneous On-chart independent close button Button On Chart Want Marco vd Heijden 2016.12.11 23:41 #79 它看起来不错,但你不能像这样使用ordermodify,你首先必须用OrderSelect()函数 选择一个订单。 Max Enrik 2016.12.12 03:04 #80 Marco vd Heijden: 它看起来不错,但你不能像这样使用ordermodify,你首先必须用OrderSelect()函数 选择一个订单。 很好,我很快就会尝试。谢谢! 123456789101112131415...43 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
好的,所以如果你用
double stop;
stop=stoploss*Point();
Print(DoubleToString(stoploss));
通过使用Point()函数,应该可以得到你的止损值,然后你必须从买入价和卖出价中分别加上或减去该值,以得到你的止损价格水平。
同样的方法也适用于获利,当然是相反的。
你可以查看代码库中的一些EA,那里有很多例子和变化,说明编码员如何在他们的EA中做这些事情。
例如,这里有一个叫做 "拖曳大师 "的例子https://www.mql5.com/en/code/16136
// 1. Main function
//-------------------------------------------------------------------------
void OnTick(void)
{
Comment("Copyright © 2016, Il Anokhin\n"+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//--- 1.1. Define pip -----------------------------------------------------
if(Digits==4 || Digits<=2) pip=Point;
if(Digits==5 || Digits==3) pip=Point*10;
//--- 1.2. Trailing -------------------------------------------------------
for(i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol() && TS>0 && OrderProfit()>0)
{
if(UC==true && OrderComment()==Comm && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0);
if(UC==true && OrderComment()==Comm && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0);
if(UC==true && OrderComment()==Comm && UM==false && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0);
if(UC==true && OrderComment()==Comm && UM==false && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0);
if(UC==false && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0);
if(UC==false && UM==true && OrderMagicNumber()==Magic && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0);
if(UC==false && UM==false && OrderType()==OP_BUY && OrderOpenPrice()+TS*pip<=Bid && OrderStopLoss()<Bid-TS*pip) w=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TS*pip,OrderTakeProfit(),0);
if(UC==false && UM==false && OrderType()==OP_SELL && OrderOpenPrice()-TS*pip>=Ask && (OrderStopLoss()>Ask+TS*pip || OrderStopLoss()==0)) w=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TS*pip,OrderTakeProfit(),0);
}
}
}
//--- 1.3. End of main function -------------------------------------------
在这里你可以看到编码员Il Anokhin用 拳头定义点。
但这里是另一个名为E-smart trailing的例子,来自Димаhttps://www.mql5.com/en/code/8674
//+------------------------------------------------------------------+
void ModifyStopLossInPoint(int stoploss)
{
bool result;
double sl = 0;
double point = MarketInfo(OrderSymbol(),MODE_POINT);
if (OrderType() == OP_BUY) sl = OrderOpenPrice() + stoploss * point;
if (OrderType() == OP_SELL) sl = OrderOpenPrice() - stoploss * point;
result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,CLR_NONE);
if (result && UseSound) PlaySound(var_132);
}
//+------------------------------------------------------------------+
注意到做事时的细微差别。
我总是尝试各种东西,直到我找到最有效的东西。
好的,所以如果你用...
Omg,只是快速检查出 惊人的感谢一切之前,我开始阅读和尝试的东西。我将很快尝试。
再一次深深感谢@Marco vd Heijden
对象是相互堆叠的,所以让chartevent()知道在什么按钮上的点击或对象比其他可能重叠的对象 具有最高的优先权很重要。
非常感谢,我喜欢你的评论,你的评论 更清楚,更有用。
祝你一切顺利。
好吧,如果你使用
我总是尝试各种方法,直到我找到最有效的方法。
我只是想理解你的评论,然后为我的订单、止损和止盈功能写一些好的代码--谢谢你。
所以,我已经尝试了类似下面的代码,我需要确定 欧元兑美元和FB的止损值 都是正确的,为10点?(如果你想知道我在想什么--只是我认为是的,下面的日志/结果都是10点的正确值。)
例如: stoploss value = 10; Position - BUY
log: EURUSD | 价格(ask): 1.05633/ 止损: 1.05533
log: FB | 价格(ask): 119.69/ 止损: 119.59
( 我通过void OnChartevent()调用下面的函数 )
//---
if ( sparam == _buy_name_btn )
{
ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
_Buy_calc_SL_TP();
Print( " | Click Verify / ");
}
//---
return;
{
//---
if ( _StopLoss_ON == true )
{
//_Sl = OrderOpenPrice() - _StopLoss * _Pip;
_Sl = Ask - _StopLoss * _Pip;
Print( " | Buy Calc SL TP Function / StopLoss: ", _Sl );
}
//---
return;
}
似乎是在工作。
我将尝试把威廉先生 的意见纳入EA的代码中--再次感谢威廉。伟大的Pip的计算MQL4
(请不要责怪我,因为这个代码行业对我来说非常广泛,有时我失去了理智--无论如何,我希望我能尽快完成我的贸易面板EA的代码)
我将在完成后分享我的测试EA的代码,以了解该代码是否良好/正确或什么?(因为我不是专业的编码/程序员 - 我正在努力 - )。
Keith Watford:
好吧,很公平。我懒得读你的一些帖子,因为它伤害了我的眼睛。
如果其他人有同样的感觉,那么是你们错过了,不是我。
市场已经关闭,我也不清楚其他的事情。但我尝试了下面的代码,我觉得我错过了什么,但我找不到。
(我想说的是,我的贸易面板 EA有买入和卖出的代码,但我想用手写出来,我确定这个EA是如何工作的)
提前感谢您的帮助和建议。
#define POINT int ///< `CHANGE / _Point`.
#define PIP double ///< `POINT / PipsPerPOINT`.
CHANGE points_to_change(POINT n){ return n * _Point ;}
POINT change_to_points(CHANGE c){ return POINT(c / _Point + 0.5) ;}
CHANGE pips_to_change (PIP n){ return points_to_change(pips_to_points(n));}
PIP change_to_pips (CHANGE c){ return points_to_pips(change_to_points(c));}
POINT pips_to_points (PIP n){ if( (_Digits&1) == 1) n *= 10.0; return POINT(n);}
PIP points_to_pips (POINT n){ PIP p = n; if( (_Digits&1) == 1) p /= 10.0; return p;}
string prfx = "test" ;
string sellbutton = prfx + "sell" ;
string sounduse = "tick.wav" ;
int stoploss = 10 ;
int takeprofit = 10 ;
int magic = 12345 ;
int ticket = 0 ;
int slippage = 3 ;
double lot = 0.01 ;
double sl ;
bool stoploss_on = true ;
bool result ;
bool sound_use = true ;
//---
//---
int OnInit()
{
ObjectCreate ( 0, sellbutton, OBJ_BUTTON , 0, 0, 0 );
ObjectSetString ( 0, sellbutton, OBJPROP_TEXT , "Sell" );
ObjectSetInteger ( 0, sellbutton, OBJPROP_XDISTANCE , 20 );
ObjectSetInteger ( 0, sellbutton, OBJPROP_YDISTANCE , 20 );
ObjectSetInteger ( 0, sellbutton, OBJPROP_XSIZE , 80 );
ObjectSetInteger ( 0, sellbutton, OBJPROP_YSIZE , 40 );
ObjectSetInteger ( 0, sellbutton, OBJPROP_CORNER , CORNER_LEFT_UPPER );
ObjectSetInteger ( 0, sellbutton, OBJPROP_COLOR , clrWhite );
ObjectSetInteger ( 0, sellbutton, OBJPROP_BGCOLOR , clrMaroon );
ObjectSetInteger ( 0, sellbutton, OBJPROP_STATE , false );
ObjectSetInteger ( 0, sellbutton, OBJPROP_ZORDER , 1 );
Print( "ObjectsTotal: ", ObjectsTotal() );
return(0);
}
//---
//---
void OnTick()
{
//---
//---
return;
}
//---
//---
void OnDeinit(const int reason)
{
//---
ObjectsDeleteAll( 0, prfx );
//---
return;
}
//---
//---
void OnChartEvent(const int id ,
const long& lparam ,
const double& dparam ,
const string& sparam
)
{
// Sell
if ( sparam == sellbutton )
{
ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
ticket = Orderfuntions( sellbutton );
}
return;
}
//---
//---
void SellCalcSLTP()
{
//---
if ( stoploss_on == true )
{
if ( OrderType() == OP_SELL ) sl = OrderOpenPrice() - pips_to_change( stoploss );
if ( OrderType() == OP_BUY ) sl = OrderOpenPrice() + pips_to_change( stoploss );
result = OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, CLR_NONE );
if ( result && sound_use ) PlaySound( sounduse );
}
//---
return;
}
//---
//---
int Orderfuntions( string _Order_selector )
{
// Sell Order
SellCalcSLTP();
if ( _Order_selector == sellbutton )
{
ticket = OrderSend( _Symbol, OP_SELL, lot, Bid, slippage, sl, takeprofit, "comment", magic, 0, clrMaroon );
}
return(ticket);
}
它看起来不错,但你不能像这样使用ordermodify,你首先必须用OrderSelect()函数 选择一个订单。