Как кодировать? - страница 304

 

...

1. В общем. нет, нет смысла проверять это, так как в основном у вас будет гораздо больше баров, чем нужно для "стабилизации" скользящей средней. Это не старый баг, а простая проверка количества баров в истории.

2. Да. Только имейте в виду, что поскольку iClose() (и аналогичные iOpen(), iHigh() и iLow()) являются функциями, а Close[],Open,High[],Low[] - это простые массивы с гораздо, гораздо более быстрым доступом к значениям, поэтому вы должны взвесить, действительно ли вам нужна гибкость функции над скоростью и простотой доступа к массивам.

zzz:
Здравствуйте, я новичок в программировании, но не новичок в трейдинге. Некоторое время я ничего не писал, а теперь, когда я начал разрабатывать советника, у меня появилось много вопросов. Сначала я начал с создания индикатора, а когда он будет делать то, что я хочу, я пойду дальше. Я прочитал все руководства, которые смог найти, так что теперь пришло время перейти к кодированию.

Извините, если ошибся темой - пожалуйста, подскажите, куда мне тогда писать подобные вопросы.

У меня 2, наверное, основных вопроса на данный момент, пожалуйста:

1. Во многих индикаторах, использующих МА, я вижу линии, проверяющие количество баров на графике. Так вот, если мне нужна MA200, а на графике всего, скажем, 100 баров, будет ли тогда работать iMA200? Думаю, да - я проверял, и любая MA рисуется без проблем на любом графике, так что, думаю, это старая ошибка, которую Metaquotes сейчас исправила. Итак, есть ли смысл проверять, сколько баров на графике для построения МА или использования функции iMA?

2. В чем разница между Close и iClose? Насколько я понимаю, Close может вернуть закрытие баров только на текущем графике, а iClose может вернуть любое закрытие любой валютной пары и любого таймфрейма. И в обоих случаях, чтобы получить последний закрытый бар, я должен использовать индекс [1]. Правильно ли я понимаю?

Спасибо.
 

DoubleStochastic для MT4, настоящий DoubleStochastic

Здравствуйте, ребята - новый пользователь MT4.

Я изо всех сил пытаюсь найти индикатор DoubleStochastic для MT4. Это был мой любимый индикатор на платформе VTT. И я имею в виду НАСТОЯЩИЙ DoubleStochastic - не Bressert Double Stochastic, который дает совершенно другие показания, чем оригинальный DoubleStochastic. Смотрите прикрепленный файл - Double от VTT дает немного другие показания, чем Double от MT4:

Может ли кто-нибудь помочь мне закодировать VTT'2 DoubleStochastic в MT4? Вот код VTT и логика:

Fast %K = ((Today's Close - Lowest Low in %K Periods) / (Highest High in %K Periods - Lowest Low in %K Periods)) * 100

Замедляющийся %K = N-периодное скользящее среднее быстрого %K

Двойной %K = ((Сегодняшний медленный %K - Самый низкий медленный %K в %K периодах) / (Самый высокий медленный %K в %K периодах - Самый низкий медленный %K в %K периодах)) * 100

Двойное замедление %K = N-периодное скользящее среднее двойного %K

%D = 3-периодное простое скользящее среднее двойного замедления %K

и сам код:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

Кто-нибудь свободно владеет MT4?

Я настолько привык к версии VTT, что не могу пользоваться другими.

 

...

gmailer

Разместил двойную стохастику здесь: https: //www.mql5.com/en/forum/177239/page28 (чтобы держать все версии стохастики в одном месте).

Я думаю, что это то, что вы ищете.

gmailer:
Здравствуйте ребята - новый пользователь MT4.

Я изо всех сил пытаюсь найти индикатор DoubleStochastic для MT4. Это был мой любимый индикатор на платформе VTT. И я имею в виду НАСТОЯЩИЙ DoubleStochastic - не Bressert Double Stochastic, который дает совершенно другие показания, чем оригинальный DoubleStochastic. Смотрите прикрепленный файл - Double от VTT дает немного другие показания, чем Double от MT4:

Может ли кто-нибудь помочь мне закодировать VTT'2 DoubleStochastic в MT4? Вот код VTT и логика:

Fast %K = ((Today's Close - Lowest Low in %K Periods) / (Highest High in %K Periods - Lowest Low in %K Periods)) * 100

Замедляющийся %K = N-периодное скользящее среднее быстрого %K

Двойной %K = ((Сегодняшний медленный %K - Самый низкий медленный %K в %K периодах) / (Самый высокий медленный %K в %K периодах - Самый низкий медленный %K в %K периодах)) * 100

Двойное замедление %K = N-периодное скользящее среднее двойного %K

%D = 3-периодное простое скользящее среднее двойного замедления %K

и сам код:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

Кто-нибудь свободно владеет MT4?

Я настолько привык к версии VTT, что не могу пользоваться другими.
 

^ Спасибо - это может быть оно. Вы знаете, как избавиться от этих "зеленых и розовых точек" внизу и вверху?

 

Спасибо, Младен. Это имеет смысл.

 

Привет всем,

Я пытаюсь найти способ инициировать сделку, когда моя стохастическая линия пересекает область перекупленности(80) или перепроданности(20). Я могу инициировать сделку, когда моя линия пересекается, но я не могу настроить ее так, чтобы она инициировала сделку ТОЛЬКО тогда, когда она находится в области перекупленности или перепроданности. Есть ли у кого-нибудь идеи, как я могу это сделать, или есть ли другое место, куда я могу обратиться?

Я наткнулся на несколько сайтов, где говорится о том, что нужно установить значения 20.1 и 80.1, но ничего больше.

Пожалуйста, помогите пролить свет. Спасибо.

С уважением,

Терранс

 

...

Терранс,

Вот один поток с некоторым практическим кодом, который может быть использован в качестве примера того, что вам нужно : https://www.mql5.com/en/forum/179114

tkuan77:
Привет всем,

Я пытаюсь найти способ инициировать торговлю, когда моя стохастическая линия пересекает область перекупленности(80) или перепроданности(20). Я могу инициировать сделку, когда моя линия пересекается, но я не могу настроить ее так, чтобы она инициировала сделку ТОЛЬКО когда она находится в области перекупленности или перепроданности. Есть ли у кого-нибудь идеи, как я могу это сделать, или есть ли другое место, куда я могу обратиться?

Я наткнулся на несколько сайтов, где говорится о том, что нужно установить значения 20.1 и 80.1, но ничего больше.

Пожалуйста, помогите пролить свет. Спасибо.

С уважением,

Терранс
 

Привет, я исправил функции и теперь доволен ими. Выглядит хорошо. Однако журнал результатов торговли при бэктесте содержит только 1 ордер на покупку. Я думаю, что это может быть связано с моей функцией GetLots, но я не уверен на 100%, несмотря на то, что просматривал ее несколько раз - не могли бы вы взглянуть на нее и сообщить мне, если вы заметите что-то неправильное? Спасибо.

//--- Функция для вычисления лотов для длинных позиций

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Лоты должны быть нормализованы, чтобы учесть LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // Нормализация не округляет, а вырезает любую часть лота, которая больше LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Таким образом, риск становится немного меньше.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

если (LotStep == 1.00) LotDigit = 0;

если (LotStep == 0.10) LotDigit = 1;

если (LotStep == 0.01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}

 

...

GetLots() в том виде, в котором я его разместил, протестирован и работает так, как должен. Нет необходимости в ее изменении. Используйте ее как функцию, которая будет определять размер лота в момент открытия ордера. Остальную логику не включайте (эта функция должна делать только это: определять размер ордера в зависимости от риска, стоп-лосса и текущего состояния счета ).

Без остального кода я не смогу вам помочь. Это как если бы я мог заглянуть в маленькую дырочку и увидеть весь мир. Невозможно. Если вы хотите сохранить остальную часть кода в тайне, все, чем я могу помочь, это код, который вы разместите здесь, и я повторю: будьте уверены, что GetLots() в оригинальной форме работает так, как должен, и он должен использоваться в своей оригинальной форме.

Если вы хотите использовать ее с переменными результатами, измените риск или стоп-лосс, подаваемые на нее динамически ("определите" риск или стоп-лосс в коде перед GetLots() и затем вызовите ее с этими измененными риском или стоп-лоссом - функция будет рассчитывать правильно для заданных измененных входов) Нет необходимости менять код функции

crsnape@btinternet.com:
Привет, я исправил функции и теперь доволен ими. Выглядит хорошо. Однако в журнале результатов торговли, когда я провожу бэктест, есть только 1 ордер на покупку. Я думаю, что это может быть связано с моей функцией GetLots, но я не уверен на 100%, несмотря на то, что просмотрел ее несколько раз - не могли бы вы взглянуть на нее и сообщить мне, если вы заметите что-то неправильное? Спасибо.

//--- Функция для вычисления лотов для длинных позиций

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Лоты должны быть нормализованы, чтобы учесть LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // Нормализация не округляет, а вырезает любую часть лота, которая больше LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Таким образом, риск становится немного меньше.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

если (LotStep == 1.00) LotDigit = 0;

если (LotStep == 0.10) LotDigit = 1;

если (LotStep == 0.01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}
 

Привет, mladen Я полностью с вами согласен, функция GetLots, которую вы предоставили, действительно работает так, как должна; я протестировал ее как часть моего кода, и она сработала.

Я внес в нее изменения просто потому, что хочу изменить свой риск-перамтер в зависимости от того, выигрываю я или проигрываю. По сути, я доработал существующий код (или попытался это сделать), включив в него дополнительные правила управления капиталом.

Я могу честно сказать, что мой код не является секретным; я уверен, что многие другие рассмотрели и реализовали в коде то, что я пытаюсь сделать; но я полагаю, что есть элемент конфиденциальности, потому что я лично потратил так много времени на его разработку.

Я буду продолжать пересматривать свой код, я, очевидно, хочу попытаться решить любые проблемы самостоятельно, поскольку я горжусь тем, что учусь и делаю вещи с нуля.

Но я понял ваш последний абзац; я буду использовать одну переменную 'Risk' и изменять этот риск соответственно на выходе функции.

В любом случае, спасибо, что ответили еще раз, без вас этот форум не был бы прежним; вы помогали мне бесчисленное количество раз.

Будьте здоровы :-)

Причина обращения: