inputint ma_shiftT=-1; inputint ma_shiftD=1; int iTEMAHandle; // хэндл индикатора iTEMA int iDEMAHandle; // хэндл индикатора double ma1Val[]; // динамические массивы для хранения численных значений для каждого бара double maVal[]; //
inputint ma_shiftT=-1; inputint ma_shiftD=1; int iTEMAHandle; // хэндл индикатора iTEMA int iDEMAHandle; // хэндл индикатора double ma1Val[]; // динамические массивы для хранения численных значений для каждого бара double maVal[]; //
我创建并保存了一个专门用于示例设置的图表模板,其名称与示例相同--"Two iMA Shift minus shift plus.tpl"。将此模板保存在终端的 \MQL5\Profiles\Templates文件夹中。现在,当你运行测试器时,测试器将拾取这个模板,你将在测试器中得到这样一张漂亮的图片。
你好。
请帮助。
当指标线 在第一根柱子上被交叉时发出信号。
如果移位ma_shiftT=0,ma_shiftD=0,该仓位在第一根柱子上正确打开。如果移位ma_shiftT=-1,ma_shiftD=1,该仓位在第三或第四根柱子上打开。
如果在第一根柱子上被交叉,我应该怎么做才能建仓?
input int ma_shiftD=1;
int iTEMAHandle; // хэндл индикатора iTEMA
int iDEMAHandle; // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений для каждого бара
double maVal[]; //
//+------------------------------------------------------------------+
int OnInit()
{
//---
m_symbol.Name(Symbol());
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- освобождаем хэндлы индикаторов
IndicatorRelease(iTEMAHandle);
IndicatorRelease(iDEMAHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
//--- массив значений индикатора
ArraySetAsSeries(ma1Val,true);
//--- массив значений индикатора
ArraySetAsSeries(maVal,true);
if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
{
Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
return;
}
//====
if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
{
Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
return;
}
if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
{
Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
return;
}
bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
if(Sell_Condition_3 && Sell_Condition_4)
{
// открываю позицию SELL
}
}
第一:如果你只用一个指标值,为什么要复制5个指标值?
第二。指标线的位置并不表示它们的交叉点。
从第一个值开始,复制2个值即可。
CopyBuffer(iTEMAHandle, 0, 1, 2, ma1Val)
CopyBuffer(iDEMAHandle, 0, 1, 2, maVal)
确定是否存在交集的唯一方法是比较第二条杠和第一条杠上的线条位置。为手头的任务。
有必要考虑阵列索引的方向。在这种情况下,我们将得到
如果条件得到满足,相交的事实就很明显。交叉点的方向可以由自己决定。
ps; 哦,对了...我没有仔细看相交事实的定义。那么在任何情况下,都不需要额外的价值。它们可能是使你困惑的原因。
你好。
请帮助。
当指标线 在第一根柱子上被交叉时发出信号。
如果移位ma_shiftT=0,ma_shiftD=0,该仓位在第一根柱子上正确打开。如果移位ma_shiftT=-1,ma_shiftD=1,该仓位在第三或第四根柱子上打开。
当它在第一根柱子上交叉时,我应该怎么做才能建仓?
input int ma_shiftD=1;
int iTEMAHandle; // хэндл индикатора iTEMA
int iDEMAHandle; // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений для каждого бара
double maVal[]; //
//+------------------------------------------------------------------+
int OnInit()
{
//---
m_symbol.Name(Symbol());
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- освобождаем хэндлы индикаторов
IndicatorRelease(iTEMAHandle);
IndicatorRelease(iDEMAHandle);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
//--- массив значений индикатора
ArraySetAsSeries(ma1Val,true);
//--- массив значений индикатора
ArraySetAsSeries(maVal,true);
if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
{
Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
return;
}
//====
if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
{
Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
return;
}
if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
{
Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
return;
}
bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
if(Sell_Condition_3 && Sell_Condition_4)
{
// открываю позицию SELL
}
}
我附上了一个例子来帮助你--在这个例子中,我不是在复制多个值,而是一次复制一个。通过比较我的例子和你的例子的返回结果,你应该看到--你的例子中的数组是如何进行索引的(也就是说,你应该理解来自bar 1的元素在数组中的存储位置和来自bar 2的元素的存储位置)。
如何用我的例子来工作。
我创建并保存了一个专门用于示例设置的图表模板,其名称与示例相同--"Two iMA Shift minus shift plus.tpl"。将此模板保存在终端的 \MQL5\Profiles\Templates文件夹中。现在,当你运行测试器时,测试器将拾取这个模板,你将在测试器中得到这样一张漂亮的图片。
当它检测到一个十字路口时,测试员将在指令处停下来
if(ma_one_1<ma_two_1 && ma_one_2>ma_two_2)
{
string text="ma_one_1 = "+DoubleToString(ma_one_1,Digits()+1)+"\n"+
"ma_two_1 = "+DoubleToString(ma_two_1,Digits()+1)+"\n"+
"ma_one_2 = "+DoubleToString(ma_one_2,Digits()+1)+"\n"+
"ma_two_2 = "+DoubleToString(ma_two_2,Digits()+1);
Comment(text);
DebugBreak();
}
你将能够在测试器中使用 "十字线 "在条形上移动,并看到条形1和条形2的指标值(预先包括 "数据窗口")。
你好!
我有一个关于外汇交易中点差的问题。
当价差扩大时,是ASK提高,BID降低,还是两者在不同方向上对称移动?
你好!
我有一个关于外汇交易中点差的问题。
当价差扩大时,是ASK上升,BID下降,还是两者在不同方向上对称移动?
它可以是你喜欢的任何东西。有一点是不变的--价差是卖出价和买入价之间的差异。
我是否正确地理解,当价差开始缩小时,它们可以同时向对方移动?
"有一点是不变的--价差是卖出价和买入价之间的差异。"
没有其他法律。
"有一点是不变的--价差是卖出价和买入价之间的差异。"
没有其他法律。
你怎么看,如果我有一笔买入,价差开始扩大,Ask上升,Bid下降,我应该平仓 还是等到Ask下降?
买入(BUY位置)以买入价关闭。
你可能问的另一件事是 "在超高波动时期该怎么办?"。答案是,每个人的决定都不一样。
买入(BUY位置)以买入价关闭。
你可能问的另一件事是 "在超高波动时期该怎么办?"。答案是,每个人的决定都不一样。
买入(BUY位置)以买入价关闭。
你可能问的另一件事是 "在超高波动时期该怎么办?"。答案是,每个人的决定都不一样。