[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 555

 
granit77 >>:
Лот и магик никто не имеет права трогать, а к комментарию на хвост будет дописка брокера. Но свой комментарий всегда можно найти поиском подстроки.

我在论坛上的某个地方看到,原则上,评论可以完全由经纪人取代。也就是说,结果是EA在一个经纪商那里工作正常,而在另一个经纪商那里则完全错误。所有 "不可改变 "的参数都是产生魔法的必要条件。这就是为什么我只想使用那些肯定会保持不变的东西。

 
drknn >>:

Вы говорите, что у Вас сигнал тянется аж до самого разворота. Но и это можно обойти. Ордеров в рынке нет - проверяем наличие сигнала. Сигнал появился - открыли позу, сняли сигнальный флаг (обнулили переменную) и больше не проверяем наличие сигнала (например лонгового) до тех пор, пока ни возникнет противоположный сигнал (шортовый). Таким образом флаг наличия сигнала заданного типа будет вообще жить считанные секунды - флаг встал, ордер встал, флаг снят - ждём противоположного сигнала. Противоположный возник, флаг противоположного сигнала устанавливаем и устанавливаем флаг, дающий добро отслеживать сигналы, которые до этого отслеживать было запрещено.

Старт работы советника (не функция start(), а лишь начало работы):

- даём добро отслеживать и лонговые и шортовые сигналы.

Появился лонговый сигнал:

- даём добро отслеживать шортовые сигналы

- Ставим лонговый ордер и если этот ордер встал, то

- Снимаем флаг, дающий добро отслеживать лонговые сигналы.

Появился шортовый сигнал

- Если есть добро разворачивать ордера, то закрываем лонговый ордер и устанавливаем шортовый

- Устанавливаем флаг, дающий добро отслеживать лонговые сигналы и снимаем флаг, дающий добро отслеживать шортовые сигналы.

Вобщем, флаги - это выключатели. Можно так же сконструировать не выключатели, а переключатели. В этом случае советник начинает работать по принципам кибернетического автомата, который обладает памятью о том, в каком состоянии он находится. Этого можно достигнуть, например, объявив целочисленную переменную и присваивая ей номера состояний. Например в блоке инициализации пишем

Sostojanie=0;

А вот уже в старте советник знает, что в нулевом состоянии (if(Sostojanie==0){}) советнику разрешено делать только операции А, В и С. И в зависимости от того, каков будет результат одной или нескольких этих операций, советник выбирает в какое состояние нужно перейти (Sostojanie=1;// или 2, или 3 и так далее), или наоборот, остаться ли в текущем состоянии.

В каждом состоянии советник знает, что ему делать можно, а что нельзя, и при наступлении каких условий он должен перейти в иное состояние.

非常感谢你提出的有价值的想法。我一定会这样做...
祝您好运!
 
double tmp=Ask; while(Ask<=tmp) tmp=Ask; 不会退出循环,即Ask总是等于tmp。RefreshRates()也不起作用。
 

如果在测试器中,它不会工作,但如果在战斗中,把Sleep() 放在循环内。

 
它能在现实世界中工作吗?......如果能,这就是问题的一半。你如何让它在测试器中工作?
 

你必须看一下代码,否则你只是在猜测,我不是灵媒。

 
double tmp=Ask; while(Ask<=tmp) tmp=Ask;Print("This IS WORKED!"); 这就是所有的代码
 

对于一个测试者,你可以这样做

double tmp=Ask; 
if(Ask<=tmp) 
  {
  tmp=Ask; 
  Print("ЕТО ЗАРАБОТАЛО!"); 
  }
 
我需要一个循环,而不是一个条件...我需要while(直到这种情况发生,然后不要让它发生,它就会发生,因为Ask<=tmp不可能总是发生)
 
maryan.dirtyn >>:
мне нужен именно цикл
double tmp=0; 
while(Ask<tmp || Ask>tmp){// цикл выполняется до тех пор, пока условие истинно
                          //именно фактор наличия истины в условии запускает цикл в работу и держит его во включенном состоянии
  RefreshRates();// проверяем поступление новой котировки
  if(tmp!=Ask){//пришла новая котировка
    tmp=Ask;// выполняем какие-то действия...
    Print("ЕТО ЗАРАБОТАЛО!");
    break;//выходим из цикла после почти бесконечного числа итераций, которые тупо пригрузили мой проц
  }
}

你不必使用break,我只是指出来,让你不要忘记强行中断循环迭代线程的可能性。
原因: