//переводит котировку в цену/1_лот в валюте депозита, например 0.00015 для EURUSD будет равно $15/лот bool Quote2Price(double diff,double &price4lot,string symbol="EURUSD") { int dig=(int)MarketInfo(symbol,MODE_DIGITS); if(dig == 0) return(false); // symbol is none double tickSize = MarketInfo(symbol, MODE_TICKSIZE); // пункт в валюте котировки (0,00001 для EURUSD на 5-знаке) //double tickValue = MarketInfo(symbol, MODE_TICKVALUE); // пункт в валюте депозита ($1 для EURUSD на 5-знаке) double tickValue; if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)) // пункт в валюте депозита ($1 для EURUSD на 5-знаке) Print(__FUNCTION__, " SymbolInfoDouble(...) returns false"); // всегда возвращается true!! Print("tickSize= ", tickSize, " tickValue= ", tickValue); if(tickValue == 0.0) // исключений нет, терминал врет, надо тупо везде проверять на деление на ноль... returnfalse; double price=diff/(tickSize/tickValue); // а то завалимся c tickValue == 0 price4lot=NormalizeDouble(price,2); return (true); }
如果OnCalculate被OnTick取代,就不会发生错误。问题不在于SymbolInfoTick,而在于指标没有正确设置为不跳过。
测量花了多长时间?而这与设定指标 有什么关系?当前刻度线的到达时间是10,上一个刻度线的到达时间是11。这是一个函数的错误,没有返回当前值。你同意当前的时间值不能小于前一个时间值,对吗?
SymbolInfoTick在指标中的工作方式与在EA中的工作方式不同。
在一个指标中,它总是返回调用OnCalculate的起始点的tick。而指标中的这些启动点不应该被跳过--这是开发者的意识形态。问题是在形成这些小数点的队列中。
在EA中,OnTick中的SymbolInfoTick并不返回启动OnTick调用的tick,而是对当前状态进行全面请求。
在Si上测量了10分钟。
SymbolInfoTick在指标中的工作方式与在EA中的工作方式不同。
在一个指标中,它总是返回调用OnCalculate的起始点的tick。而指标中的这些启动点不应该被跳过--这是开发者的意识形态。问题是在形成这些小数点的队列中。
在专家顾问中,OnTick中的SymbolInfoTick并不返回启动OnTick调用的tick,而是对当前状态进行完整的请求。
在Si上测量了10分钟。
第三,即使SymbolInfoTick()没有问题--它仍然比CopyTicks()好用,因为它经常返回更多最新的数值。
捕捉到CopyTicks提供的数据比SymbolInfoTick调用的LATER更近的情况。这就是为什么我同时用两个函数进行查询,并从中选择最近的刻度。
SymbolInfoTick在指标中的工作方式与在EA中的工作方式不同。
在一个指标中,它总是返回调用OnCalculate的起始点的tick。而指标中的这些启动点不应该被跳过--这是开发者的意识形态。问题是在形成这些小数点的队列中。
在专家顾问中,OnTick中的SymbolInfoTick并不返回启动OnTick调用的tick,而是对当前状态进行完整的请求。
那么,与之相辅相成的是符合逻辑的。
与造成这种情况的蜱虫,特别是因为它不需要任何费用。
而SymbolInfoTick()函数 应该在指标和专家顾问中完全实现(它将返回当前价格,而不是调用OnCalculate 时的价格)。
MT4继续以不可预测的方式让人惊讶 ))谁来编写交易功能的实现?MT4 build 1045
让我们从幽默的信息开始,应该把它送给扎多诺夫,因为他总是在说愚蠢的美国人。
符号_交易_刻度线_值
价值 SYMBOL_TRADE_TICK_VALUE_PROFIT
双
符号_交易_点值_利润
不支持
双
符号_交易_点值_损失
不支持
双
同时SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)产生一个值。BUT!!!!!如果你把指标扔在图表上,在启动时是可以的。而且,如果你重新启动终端,这个函数将在第一次调用时返回真和零tickValue所以不要放松,专家顾问的开发者先生,一切都要亲手检查。
bool Quote2Price(double diff,double &price4lot,string symbol="EURUSD")
{
int dig=(int)MarketInfo(symbol,MODE_DIGITS);
if(dig == 0)
return(false); // symbol is none
double tickSize = MarketInfo(symbol, MODE_TICKSIZE); // пункт в валюте котировки (0,00001 для EURUSD на 5-знаке)
//double tickValue = MarketInfo(symbol, MODE_TICKVALUE); // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
double tickValue;
if(!SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE, tickValue)) // пункт в валюте депозита ($1 для EURUSD на 5-знаке)
Print(__FUNCTION__, " SymbolInfoDouble(...) returns false"); // всегда возвращается true!!
Print("tickSize= ", tickSize, " tickValue= ", tickValue);
if(tickValue == 0.0) // исключений нет, терминал врет, надо тупо везде проверять на деление на ноль...
return false;
double price=diff/(tickSize/tickValue); // а то завалимся c tickValue == 0
price4lot=NormalizeDouble(price,2);
return (true);
}
退出。
2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0
2017.02.07 16:08:25.332 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 1.0
2017.02.07 16:08:24.515 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0
2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: tickSize= 1e-05 tickValue= 0.0
2017.02.07 16:08:23.037 ShowImportantParams EURUSD.e,M15: 已初始化
2017.02.07 16:08:23.002 自定义指标 ShowImportantParams EURUSD.e,M15:加载成功
那就顺理成章地补充
与叫它的虱子,特别是因为它不需要任何费用
而SymbolInfoTick()函数 应该在指标和专家顾问中完全发挥作用(返回当前价格,而不是调用OnCalculate 时的价格)。
甚至在当前队列中添加一个勾号也是有意义的。