新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1386

 
Mikhail Mishanin:

这很有趣)它不应该是)。

如果战斗结束了--用正常的价差进行交易,只需在输入中取出它的 "限价",如果价差超过限价,就忽略交易。

价差可以通过莳萝来拉长,而不需要翻转。

我有相当多的价差波动,从10个单位到45个单位。

我得等着放映45 分钟。

同时,该函数的平均计数为17,这是很令人满意的。

翻身后1小时内会上升到100-140,我将运行代码,看看它的表现如何。

 
Vitaly Muzichenko:

不过,你可以这样开处方。

它应该正常工作。

我不喜欢这种逻辑。

函数的第一个输入。

res = 0;

因此,条件是

if(dt.hour==22 && res<_sp)

是不满足的。

我也不想进一步讨论细节。突然出现这种状况是为了什么?

   if(tc>LONG_MAX-1)
我不明白这一切的逻辑。
 
Alexey Viktorov:

我不喜欢这种逻辑。

函数的第一个输入。

res = 0;

因此,该条件

if(dt.hour==22 && res<_sp)

没有得到满足。

我也不想再多说什么了。突然出现这种状况是为了什么?

   if(tc>LONG_MAX-1)
我不明白这一切的逻辑。

1.这种情况只在翻身后1小时内出现,此时时间为22小时。但这只是在第一次启动时,而终端总是与专家顾问一起工作,这意味着它只空一次。

也许在时间框架改变的情况下,它也应该被声明为静态的。

2. if(tc>LONG_MAX-1) = 如果我们超过了long的允许限度,我们将变量 tc归零。这不太可能发生,因为终端有时会超载,例如在周末。

---

改变了代码,这必须是最终的。

void OnTick()
{
 int sp = SymbolInfoInteger(Symbol(),SYMBOL_SPREAD);
   if(CheckSpr(sp)) {
      // Здесь код отправки
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlDateTime dt;
bool CheckSpr(int _sp)
{
   static int ts=0;
   static ulong tc=0;
   static int res=0;
   TimeGMT(dt);
   if(res<_sp && (dt.hour==22||dt.hour==23)) { // Если 2 часа после Rollover спред упадёт до нормального - торгуем
      Comment("Rollover: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(false);
   }
   tc++;
   ts += _sp;
   res =ts/tc;
   if(tc<500) {
      Comment("Тиков менее 500: ",tc,", Спред: ",_sp,", Средний: ",res);
      return(false);
   }
   if(res>_sp) {
      Comment("Торгуем: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
      return(true);
   }
   Comment("Не торгуем - спред завышен: Спред: ",_sp,", Средний: ",res,", Тиков: ",tc);
   return(false);
}

P.S. 将其用于测试

P.S. 修改了代码

----

P.S.S.S. 我在翻身后增加了1个小时的时间,否则我在一些交易商身上的点差非常高

最后的变体已经工作了20个小时,结果是惊人的。

平均每日价差为10-45个点,但大部分时间是10-17个点,平均价差计算为19

感谢大家的参与,如果你有什么要补充的--写出来吧!

 
Vitaly Muzichenko:

也许它也应该被宣布为静态的,以备时间框架的变化。

我已经理解了它,它似乎在工作,我收回 "它不应该"),现在我真的只需要搞清楚归零/分配的时刻。

 

我在论坛上看到过讨论,但找不到了。

需要限制在一个酒吧的一个位置,可以在任何时候打开,这是现在的选择,但在我看来,它是 "沉重的"

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

怎样才能将其替换掉,使之变得更轻?

 
Vitaly Muzichenko:

我在论坛上看到过讨论,但找不到了。

我需要把自己限制在一个随时可以开仓的栏位上,这也是现在的一个选择,但在我看来是 "重"。

怎样才能将其替换掉,使之变得更轻?

"你需要把自己限制在酒吧的一个位置上,这个位置随时都可能被打开......"

太笼统的措辞,你的意思是,一旦在这个符号的条形图上,你可以发送OrderSend

 
Mikhail Mishanin:

"你必须把自己限制在酒吧的一个位置上,这个位置随时都有可能被打开......"

措辞太笼统了,你的意思是,在这个符号中,每个柱子可以发送一次OrderSend

是的,专家顾问在H1时间框架上工作,可以在10:17开仓,它需要在11:00之前不开另一个仓位,也就是在当前的柱子上。

 
Vitaly Muzichenko:

是的,EA在H1时间段工作,可以在10:17开仓,你需要确保在11:00之前,也就是在当前条形图上--它不会再开仓。

是的,同样,我认为魔鬼在细节中。

打开一个位置--设置一个 "禁止标志 "和/或保存 "时间"(哪个并不重要,只要是相同的(来源)进行比较)。

一个新的酒吧被打开 - "禁止标志 "被设置...

问题:如果职位发生了某种变化怎么办?

我如何定义一个新条形图的例子 - doTB除数为秒,对于H1来说,它是3600.0

BARii[].time - 与M1有关的小节时间,但它可以是任意的,也可以是任何除数,如果它大于或等于1,则表示不同小节的 "时间"。

if(MathFloor(BARii[0].time/doTB)-MathFloor(BARii[1].time/doTB)>=1.0)//если бар закрылся
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
Mikhail Mishanin:

是的,在我看来,又是不完整的条件,"魔鬼在细节中",简单说来,如果文字

打开一个位置--设置一个 "禁止标志 "和/或保存 "时间"(哪个并不重要,只要是相同的(来源)进行比较)。

一个新的酒吧被打开 - "禁止标志 "被设置...

问题:如果职位发生了某种变化怎么办?

我如何定义一个新条形图的例子 - doTB除数为秒,对于H1来说,它是3600.0

BARii[].time - 与M1有关的小节时间,但可以是任意的,也可以是任意的除法,如果它大于或等于1,则表示不同小节的 "时间"。

当时我对使用标志的选项并不满意;我不记得为什么,但我把它替换为

if(Bars(Symbol(), PERIOD_CURRENT, Buy.LastOpenTime, TimeCurrent())==0) return; // Открывать не более 1 на баре

好的,我会考虑另一种实现方式

 
Vitaly Muzichenko:

我当时对旗帜选项不满意,我不记得原因了,但我把它换成了

好的,我会考虑另一种实现方式。

那么,这种实施方式又牵制了什么呢?与我的代码类似,在一个 "条 "中确定两次,或在不同的 "条 "中确定。只是在我的变体中,在不同的 "条 "中为 "真",在你的变体中,在一个条中为 "真",只是绕过与 "0 "的比较==,特别是整数,沃,我可能可以将条件改为>0.0或>0.9,需要考虑...