Δtime=TimeCurrent()-time;//перестраховка на случай, если TimeCurrent() во время выполнения цикла изменитсяswitch(Δtime){
case0 ://если секунда не прошла
AccumulatorOfTicks(false);//заносим в массив-накопительbreak;
case1 ://если прошла ОДНА секунда после последнего тика
WriteBar();//по предыдущему тику рисуем свечу
AccumulatorOfTicks(true);//и ловим текущий тикbreak;
default://если прошло НЕСКОЛЬКО секунд после последнего тика
WriteBar();//по предыдущему тику рисуем свечу
Δtime--; time++;//уменьшаем разницу на единицу, т.к. свечу уже нарисовалиwhile(Δtime!=0) WriteDash();//и рисуем прочерки по кол-ву пропущ. сек. минус один
AccumulatorOfTicks(true);//ловим текущий тик
}
void WriteBar(){
if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell//проверяем, переместилось-не переместилось, это я убрал, т.к. к вопросу не относится.
}else{
FileWriteInteger(hand1e, time, LONG_VALUE);//TimeCurrent()FileWriteDouble (hand1e, bid[0], DOUBLE_VALUE);//Open[]FileWriteDouble (hand1e, bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]FileWriteDouble (hand1e, ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]FileWriteDouble (hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]FileWriteDouble (hand1e, ArraySize(ask), DOUBLE_VALUE);//Volume[]FileFlush (hand1e);
fpos = FileTell (hand1e);//запоминаем позицию записи в файлеif(ArraySize(ask)==2) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - volume = ", ArraySize(ask)));
if(bid[0]==ask[ArraySize(ask)-1]) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - bid=ask, Ticks = ", ArraySize(ask)));
/*Необходимое пояснение. Хотя код рассчитан в т.ч. на тени свечей (т.е. независимыми от Open и Close
High и Low), в реальности их на чарте не будет, т.к. в секунде максимум 2 тика, три тика в секунде
я ещё не встречал. Поэтому в массиве из двух элементов (т.е. двух тиков)
один будет максимумом, другой минимумом, - и невольно совпадать с Open и Close.*/
}
}
void WriteDash(){
if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell//аналогично убрал, т.к. к вопросу не относится.
}else{//ставим прочерк на Close[0]
Δtime--; time++;
FileWriteInteger(hand1e, time, LONG_VALUE);//TimeCurrent()FileWriteDouble (hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Open[]FileWriteDouble (hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//High[]FileWriteDouble (hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Low[]FileWriteDouble (hand1e, ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]FileWriteDouble (hand1e, 0, DOUBLE_VALUE);//Volume[]FileFlush (hand1e);
fpos = FileTell (hand1e);//запоминаем позицию записи в файле
}
}
//-----------------------------------------------------------------------------+
//Kim 尊敬和尊重 !!! |
//+----------------------------------------------------------------------------+
这是到目前为止最紧张的部分,代码))))
好的。我什么都不明白。我让第二个TF启动并运行。一切都应该像时钟一样运行。但它并没有。不,它在工作,但它不像预期的那样。检查了一千次。我自己没有看到任何句法或算法上的错误。让我试着解释一下。 我把完整的代码附在后面。所以。
在start()的开头,我为上次start()后的秒数设置了一个处理程序。重复的部分被移到用户定义的函数中。新的值time=TimeCurrent()被分配到那里,在用户函数中。
该函数在两种模式下工作:在第一个分支中,AtFirst=true,它只捕捉一个tick并将数组存储预清零,而在第二个分支中,AtFirst=false,它完全作为一个tick存储工作。也就是说,我们要么把存储空间清零并截断,然后在零单元中抓出价,要么延长存储空间并抓出价。设置警报只是为了调试。我将进一步描述累积器归零的情况。
绘制 "蜡烛 "的功能(在自主图表中打开的.hst中添加一个蜡烛)。同样地--我把警报放在调试的地方。第一个警报信号是在一秒钟内抓到两个ticks(数组大小等于2,在想法中体积应该等于2),而第二个警报信号是在抓到的tick中等于ack的位(驱动中类似的警报:但由于某些原因它们的工作是不同步的),以及蜡烛图的体积。这都是理论上的,事实上,当输入文件时(通过警报),例如,二(或0x00 00 00 00 00 40,双倍2.0),不知为何还是变成了一(0x00 00 00 00 F0 3F,BigEndian格式的双倍1.0)。我通常在驱动器中覆盖该警报,它经常发出哔哔声,我和这两个人一起工作。
该函数 "画 "了一个破折号,以防在哪一秒内没有打勾。它根据以下算法工作。
Δtime=0:捕捉(复制)ticks。
Δ时间=1:在之前捕捉的tick上画一个蜡烛图,然后捕捉tick(有一个初步归零的累积器)。
Δ时间>1:在之前抓到的tick上画一个蜡烛,在Close[0]线上画破折号,数量为Δ时间-1,抓到一个tick(有初步归零的累积器)。在任何情况下,当一个蜡烛已经在上面画好时,累积器应该被清零,这意味着累积器不再需要了。当Δ时间>0时就会发生这种情况。
让我们来捋一捋。
箭头画出的时刻,出价应该等于升价,成交量应该等于1。我没有用体积捕捉底部,反正你在那里看不到任何东西,它很浅。但它们都是水平的,即要么是零,要么是一,没有一个上升到二(尽管警报在发出信号)。每秒两个点--仍然在鼠标悬停处讽刺地显示成交量=1,而出价等于asku也讽刺地显示成交量=0。为什么?我明白在某处有一个错误,但很可能我没有注意到这个错误,或者找错了地方。我把代码附在后面,我把我的那部分代码注释得很好,到处检查了缩进,删除了内嵌器,只是选择了要使用的函数,这样就可以更快地编译了。唯一值得注意的是--它不像原来的tick collector那样在离线状态下工作,即在TimeLocal下工作,因为我在那里从头开始写了if(tickTimeLocal==true)(因为我不太需要它)。我试图按照塔拉斯的建议把它翻译成专家顾问 - 蜡烛图没有显示在自主图表中(但当前报价的线条移动良好)。
你的拖鞋。
你好
这里有一个问题。比方说,今天是星期一。我需要知道周五的收盘价。我需要知道周五的收盘价。
我问这个问题是因为我在策略测试器中看到了周六和周日条。我没有在这些日子里进行交易。上面的文字线是周五还是周日的收盘价?你好
这里有一个问题。比方说,今天是星期一。我需要知道周五的收盘价。我可以写
我得到这个问题是因为在策略测试器中,我看到周六和周日有酒吧。我在那些日子里不做交易。上面写的是周五或周日的收盘价?给我周五的价格!如果服务器在周五不晚于24点关闭,并在周日后不早于0点开始!
使用DailyPivotPoints指标!
不,我完全不明白。显然已经在写了
在警报等于2的时候,我把指标从分钟上取下来,我把鼠标拖到蜡烛上......。量=1。
通过FileInsight(像调试器)查看了hst中的RateInfo,我想也许有int,但不是Volume中的double--不,同样是double......。
晚上好。
谢谢你对我问题的答复))
请告诉我,如果我像这样下一个买入订单 OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green)。
如果是卖出指令OrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red)。
差异是蓝色的,还是也需要改变红色? 也就是说,OP_BUY是买入价。
其中OP_SELL有卖价
我还想检查我的订单是否有变化,我不想改变它,那么为什么在策略测试器和模拟中一切顺利,但当我试图在真实市场中打开它时,却出现了129的错误?
晚上好。
谢谢你对我问题的答复))
请告诉我,如果我像这样下一个买入订单 OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green)。
如果是卖出指令OrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red)。
差异是蓝色的,还是也需要改变红色? 也就是说,OP_BUY是买入价。
其中OP_SELL有卖价
我还想检查我的订单是否有变化,我不想改变它,那么为什么在策略测试器和模拟中一切顺利,但当我试图在真实市场中打开它时,却出现了129的错误?
晚上好。
谢谢你回答我的问题))。
你能告诉我,如果我开一个买入订单,像这样OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green)。
如果是卖出指令OrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red)。
...卖掉。
我建议在发送订单前更新报价。
RefreshRates(); OrderSend (...);
并注意你的滑点=3,对于4位数的报价将是=3点,对于5位数的报价将计算为0.3点。因此,如果你的EA要使用5位数的报价,那么设置滑移量=30。不,我完全不明白。很明显,我已经在写
在警报等于2的时候,我把指标从分钟上取下来,我把鼠标拖到蜡烛上......。量=1。
通过FileInsight(像调试器)查看了hst中的RateInfo,我想也许有int,但不是Volume中的double--不,同样是double......。
看了你的代码....你太糊涂了))))
我不太明白,为什么我们需要积累ticks,因为在内存中存储(甚至不存储,因为当前的bar必须写在HST中--否则图表不会被更新)当前bar的参数--六个数字TOHLCV,并在tick接收时根据需要更新它们,并在指定条件(TimeCurrent()-O>1)下使bar截止。
尝试以这种方式重写代码,它将减少8倍,我保证(我检查过:)。