[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 299

 
palomnik:

//-----------------------------------------------------------------------------+
//Kim 尊敬和尊重 !!! |
//+----------------------------------------------------------------------------+

这是到目前为止最紧张的部分,代码))))

好的。我什么都不明白。我让第二个TF启动并运行。一切都应该像时钟一样运行。但它并没有。不,它在工作,但它不像预期的那样。检查了一千次。我自己没有看到任何句法或算法上的错误。让我试着解释一下。 我把完整的代码附在后面。所以。

Δtime=TimeCurrent()-time;//перестраховка на случай, если TimeCurrent() во время выполнения цикла изменится
switch(Δtime){
  case 0 ://если секунда не прошла
    AccumulatorOfTicks(false);//заносим в массив-накопитель
    break;
  case 1 ://если прошла ОДНА секунда после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    AccumulatorOfTicks(true);//и ловим текущий тик
    break;
  default://если прошло НЕСКОЛЬКО секунд после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    Δtime--; time++;//уменьшаем разницу на единицу, т.к. свечу уже нарисовали
    while(Δtime!=0) WriteDash();//и рисуем прочерки по кол-ву пропущ. сек. минус один
    AccumulatorOfTicks(true);//ловим текущий тик
}

在start()的开头,我为上次start()后的秒数设置了一个处理程序。重复的部分被移到用户定义的函数中。新的值time=TimeCurrent()被分配到那里,在用户函数中。

void AccumulatorOfTicks(bool AtFirst){
        if (AtFirst){
                ArrayResize(bid, 1);//урезаем использованные массивы
                ArrayResize(ask, 1);
                i=0;//обнуляем счётчик тиков в секунду
                time=TimeCurrent();//приводим счётчик времени к текущему
        }else{
                ArrayResize(bid, i+1);
                ArrayResize(ask, i+1);
                i++;
        }
        bid[i]=MarketInfo(symbol, MODE_BID);
        ask[i]=MarketInfo(symbol, MODE_ASK);
        if (bid[i]==ask[i]) Alert("from accumulator: bid=ask");
}

该函数在两种模式下工作:在第一个分支中,AtFirst=true,它只捕捉一个tick并将数组存储预清零,而在第二个分支中,AtFirst=false,它完全作为一个tick存储工作。也就是说,我们要么把存储空间清零并截断,然后在零单元中抓出价,要么延长存储空间并抓出价。设置警报只是为了调试。我将进一步描述累积器归零的情况。

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.*/
        }
}

绘制 "蜡烛 "的功能(在自主图表中打开的.hst中添加一个蜡烛)。同样地--我把警报放在调试的地方。第一个警报信号是在一秒钟内抓到两个ticks(数组大小等于2,在想法中体积应该等于2),而第二个警报信号是在抓到的tick中等于ack的位(驱动中类似的警报:但由于某些原因它们的工作是不同步的),以及蜡烛图的体积。这都是理论上的,事实上,当输入文件时(通过警报),例如,二(或0x00 00 00 00 00 40,双倍2.0),不知为何还是变成了一(0x00 00 00 00 F0 3F,BigEndian格式的双倍1.0)。我通常在驱动器中覆盖该警报,它经常发出哔哔声,我和这两个人一起工作。

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);//запоминаем позицию записи в файле
        }
}

该函数 "画 "了一个破折号,以防在哪一秒内没有打勾。它根据以下算法工作。

Δtime=0:捕捉(复制)ticks。

Δ时间=1:在之前捕捉的tick上画一个蜡烛图,然后捕捉tick(有一个初步归零的累积器)。

Δ时间>1:在之前抓到的tick上画一个蜡烛,在Close[0]线上画破折号数量为Δ时间-1,抓到一个tick(有初步归零的累积器)在任何情况下,当一个蜡烛已经在上面画好时,累积器应该被清零,这意味着累积器不再需要了。当Δ时间>0时就会发生这种情况

让我们来捋一捋。

箭头画出的时刻,出价应该等于升价,成交量应该等于1。我没有用体积捕捉底部,反正你在那里看不到任何东西,它很浅。但它们都是水平的,即要么是零,要么是一,没有一个上升到二(尽管警报在发出信号)。每秒两个点--仍然在鼠标悬停处讽刺地显示成交量=1,而出价等于asku也讽刺地显示成交量=0。为什么?我明白在某处有一个错误,但很可能我没有注意到这个错误,或者找错了地方。我把代码附在后面,我把我的那部分代码注释得很好,到处检查了缩进,删除了内嵌器,只是选择了要使用的函数,这样就可以更快地编译了。唯一值得注意的是--它不像原来的tick collector那样在离线状态下工作,即在TimeLocal下工作,因为我在那里从头开始写了if(tickTimeLocal==true)(因为我不太需要它)。我试图按照塔拉斯的建议把它翻译成专家顾问 - 蜡烛图没有显示在自主图表中(但当前报价的线条移动良好)。

附加的文件:
fif.ta.mq4  18 kb
 
artmedia70:

你的拖鞋。

你应该从行政部门得到一个破坏者。我已经开始注意到,由于某些原因,未加评论的鞋类并没有变得更少的鞋类))
 

你好

这里有一个问题。比方说,今天是星期一。我需要知道周五的收盘价。我需要知道周五的收盘价。

iClose(NULL, Period_D1, 1)
我问这个问题是因为我在策略测试器中看到了周六和周日条。我没有在这些日子里进行交易。上面的文字线是周五还是周日的收盘价?
 
gince:

你好

这里有一个问题。比方说,今天是星期一。我需要知道周五的收盘价。我可以写

我得到这个问题是因为在策略测试器中,我看到周六和周日有酒吧。我在那些日子里不做交易。上面写的是周五或周日的收盘价?

给我周五的价格!如果服务器在周五不晚于24点关闭,并在周日后不早于0点开始!

使用DailyPivotPoints指标!

 

不,我完全不明白。显然已经在写了

                switch(ArraySize(ask)){
                 case 0: FileWriteDouble(hand1e,  0.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 0")); break;
                 case 1: FileWriteDouble(hand1e,  1.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 1")); break;
                 case 2: FileWriteDouble(hand1e,  2.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 2")); break;
                 default: Alert("!!!!! - ", ArraySize(ask));
                }

在警报等于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的错误?

 
ed3sss:

晚上好。

谢谢你对我问题的答复))

请告诉我,如果我像这样下一个买入订单 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的错误?

如果你打开买入,在Asc,如果卖出在Bid!和关闭的另一种方式!
 
ed3sss:

晚上好。

谢谢你回答我的问题))。

你能告诉我,如果我开一个买入订单,像这样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)。

...
关于购买。
OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0,"Покупка",0,0,Green);

卖掉。

OrderSend (Symbol(),OP_SELL,Lot,Bid,3,0,0,"Продажа",0,0,Red);

我建议在发送订单前更新报价。

RefreshRates();
OrderSend (...);
并注意你的滑点=3,对于4位数的报价将是=3点,对于5位数的报价将计算为0.3点。因此,如果你的EA要使用5位数的报价,那么设置滑移量=30。
 
gyfto:

不,我完全不明白。很明显,我已经在写

在警报等于2的时候,我把指标从分钟上取下来,我把鼠标拖到蜡烛上......。量=1。

通过FileInsight(像调试器)查看了hst中的RateInfo,我想也许有int,但不是Volume中的double--不,同样是double......。

看了你的代码....你太糊涂了))))

我不太明白,为什么我们需要积累ticks,因为在内存中存储(甚至不存储,因为当前的bar必须写在HST中--否则图表不会被更新)当前bar的参数--六个数字TOHLCV,并在tick接收时根据需要更新它们,并在指定条件(TimeCurrent()-O>1)下使bar截止。

尝试以这种方式重写代码,它将减少8倍,我保证(我检查过:)。

 
我试着检查一个指标,我把数字放在图表上,但它们没有变化,我试着用另一种方式,我需要附件中的指标把价格固定为站在之字形或警报或打印上的十字,但它在连接时冻结了。
附加的文件: