帮助我学习如何编程。 - 页 2

 
Alexey Viktorov:

谢谢你的例子。

我以为我是唯一一个喜欢用这种方式铺陈的人,而不是写得很屌丝。

hz - 翻译成俄语是 "我想知道"......不要想得太坏......

最好是使用标准库中 的类,这样你就不用写那些长长的PositionGet...等。

 
Dmitry Fedoseev:
谢谢你。消化。
 
Alexey Viktorov:

谢谢你的例子。

我以为我是唯一一个喜欢以这种方式布置事情的人,而不是以笨拙的方式来写。

有什么问题呢?

不要认为这是一个 "编码纳粹",但我 认为这种结构令人不安。

for(int index=PositionsTotal()-1; index>=0; index--) { /* тело цикла */ }

这是对眼睛的一种滋扰。如果不是"zaz如何",而是像这样,岂不是更好。

int index = PositionsTotal();

while (index-- > 0) { /* тело цикла */ }

或者说这种 "打酱油 "的行为。

for(int i=0;i<PositionsTotal();i++)

其中PositionsTotal() 在每个循环迭代中被调用!

一个正常的程序员绝不会通过索引(感谢上帝,这里没有索引)来操作循环的主体,从而导致其数量的改变。这只是文盲和故障代码的高度。如果要发生这样的事情,你必须以一种好的方式重新启动整个循环。

也有一些人喜欢这样的东西。

double Lot;

// где-то вычисляется значение Lot, финальная проверка и приведение к допустимым границам фееричны:
if(Lot > MaxLot) Lot = MaxLot;
if(Lot < MinLot) Lot = MinLot;

// а то и вовсе:
if(Lot > MaxLot) Lot = MaxLot;
  else
    if(Lot < MinLot) Lot = MinLot;

// а не проще ли сделать так?
Lot = MathMin(MathMax(Lot, MinLot), MaxLot);

尽管对于一个初学者来说,如果不关心额外的CPU优化时间,这种来自学校BASIC "编程 "课程的 "如果-如果-否则-所有 "的结构会更清晰。

而所有这些都是通过复制粘贴的原则在代码之间进行复制

所以,你去那里...

 
Tio Nisla:

...

或者这种 "shithcoding"。

其中PositionsTotal() 是在每个循环迭代中调用的!

...

你确定吗?你想变得聪明,但你却陷入困境...

而你是为此而登记的?就像这样--从第一个帖子开始,迷失了方向......

 
Dmitry Fedoseev:

你确定吗?你想表现得很聪明,但你已经流氓了......

而你是故意注册的?就这样,从第一个帖子开始,你就在厕所里了......

哦,亲爱的。"学习数学,"埃尔热和克努特。不要搞个人主义。

好吧,我来解释。

    for  (            int i=0            ;          i<PositionsTotal()            ;    i++     )    { }
    ^^^               ^^^^^^^                       ^^^^^^^^^^^^^^^^^^                 ^^^          ^^^
объявление   |   объявление переменной   | проверка условия выполнения цикла:     | инкремент  | тело цикла
  цикла      | типа "int", инициализация | 'i' < значения, возвращаемого функцией | переменной |
типа "for"   |       значением '0'       | которая вызывается на каждую итерацию  |

清楚了吗,亲爱的?

如果没有,请仔细阅读https://learnc.info/c/loop.html,从[ctrl+f ,寻找 "Cycle for"]的某个地方开始。

这里都懒得去找链接了。

并学会写有文采的、漂亮的、简洁的代码。你应该从汇编开始,用微控制器,每个字节都很重要。

P.S.

在这里,我甚至懒得向专家展示他的循环 "for "的一个简单例子。

int OnInit()
{
   for(int i=0;i<somefunc();i++) PrintFormat("array[%d]\n", i);
   return(INIT_SUCCEEDED);
}

int somefunc() {
   static int count = 0;
   PrintFormat("Туточки уже %d-й раз!\n", ++count);
   return 3; // это типа количество чего-то там, элементов массива например
}

而这是抽查的结果。

2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: initialized
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 4-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[2]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 3-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[1]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 2-й раз!
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: array[0]
2021.05.03 08:01:36.343 show_the_shitz EURJPY,H1: Туточки уже 1-й раз!

你可以看到,该函数不仅在每次迭代时被调用,甚至在最后还被调用+1次。

所以,你去那里。

Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
Циклы в Си. Циклы с постусловием, предусловием, Цикл for со счётчиком.
  • 1989.04.14
  • Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev
  • learnc.info
Циклы в Си: цикл while с предусловием, цикл do while с постусловием, цикл for со сщётчиком. Бесконечный цикл. Оператор break. Оператор continue. Примеры работы с циклами
 
Tio Nisla:

诶,亲爱的。"学习你的数学,"埃尔热和克努特。不要搞个人主义。

好吧,我来解释。

清楚了吗,亲爱的?

如果没有,请仔细阅读https://learnc.info/c/loop.html,从[ctrl+f ,寻找 "Cycle for"]的某个地方开始。

这里都懒得去找链接了。

并学会写有文采的、漂亮的、简洁的代码。你应该从汇编开始,用微控制器,每个字节都很重要。

P.S.

在这里,我甚至懒得向专家展示他的循环 "for "的一个简单例子。

而这是抽查的结果。

你可以看到,该函数不仅在每次迭代时被调用,甚至在最后还被调用+1次。

所以,你去那里。

我鼓掌!继续...


 
Dmitry Fedoseev:

我鼓掌!继续...


你为什么要弄得这么乱?并把它放在网上。你妈妈会骂你的!
 
如果有些代码是有压力的,令人眼花缭乱的,那么世界上还有很多其他的职业:看门人、装载机、清洁工、卫生员......。
 
Dmitry Fedoseev:

你确定吗?你想表现得很聪明,但你已经流氓了......

而你是故意注册的?就像这样--从第一个帖子开始,变成了一个水坑......。

你们的对话真有意思))))))。

先生们,个性是个性,但让我们找出真相。

使用这个例子,我可以看到PositionsTotal() 在每个循环迭代中被调用。

但迪米特里,恰恰相反,你是说编译器以不同的方式来做--我不明白。解释一下。

//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
CTrade         m_trade;
CSymbolInfo    m_symbol;
//-------------------------------------------------------------------+
void OnInit()
  {
   m_symbol.Name(Symbol());
   m_symbol.RefreshRates();

   for(int i = 0; i < 10; i++)
     {
      m_trade.Buy(1, _Symbol, m_symbol.Ask() + i * 2 * _Point, 0, 0);
     }

//---закомментировать не нужное
   for(int i = 5; i < PositionsTotal(); i++) // так удаляются только 3 сделки
     {
      m_trade.PositionClose(_Symbol);
     }
//---закомментировать не нужное
   int index = PositionsTotal();
   for(int i = 5; i < index; i++) // так удаляются 5 сделок
     {
      m_trade.PositionClose(_Symbol);
     }

//вывод: PositionsTotal() вызывается на каждой итерации
  }
//+------------------------------------------------------------------+

如果你想说PositionsTotal()函数每次都不重新计算头寸,而只是返回一个包含未平仓头寸数量的变量值,那么是的,你是对的,多声明一个变量是没有意义的,但那样的话,编译器又有什么用呢?

而如果这个函数每次都重新计算开放位置,那么事实证明,编译器必须了解这个函数的值是否会影响到进一步的计算,并使用一个函数或一个变量。

我觉得有些东西不对劲。

 
Aleksandr Slavskii:

你们的对话很有意思))))

我想在前面补充一下,如果somefunc()函数除了返回一些金额或其他东西外,还进行一些其他操作,例如计算交易参数,这样的使用会导致难以捕捉的神器,并可能导致代码的作者陷入昏迷:"Ht?怎么会有4次?O_o F$#@!!!它不是应该在那里出现三次吗?为什么我的EA对我撒谎?"。这就是我所说的 "shithcod",一位专家对其愤怒到发根。我没有提出来,因为这很明显,但你为我做到了。但是你没有考虑到,通过动态计算的索引寻址而不需要对数组进行重新初始化是另一回事。在裸露的系统中,这通常会导致GPF,在有智能指针和数组的PLUS中,会导致异常及其处理程序。在mql中,并不清楚它导致了什么。