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

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

Извините - на самом деле я смотрел на свой другой Stoch, где такие точки присутствуют. Тот, который был предложен в ответ на мое первое сообщение, был в порядке. Спасибо!

 

Может быть, только один совет:

Когда у вас есть "кирпичик" ( функция, фрагмент, часть кода), который работает нормально, не изменяйте его. Функции хороши тем, что вы можете менять их входные данные, и они работают в соответствии с ними. И, как только вы протестировали функции во всевозможных ситуациях, вам не нужно думать, работает ли она нормально. Таким образом, вы можете сократить количество кода, который вам придется просматривать при поиске ошибок (а это может значительно ускорить время разработки).

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

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

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

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

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

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

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

Я не уверен в скобках функций и в том, что в них входит.

Если я пишу функцию внутри функции, нужно ли мне помещать имя этой функции в скобки?

Например, если у меня есть функция LastOpenTicket() и она вызывается внутри функции GetLots, нужно ли заключать LastOpenTicket() в скобки, как GetLots (LastOpenTicket())?

Также нужно ли помещать туда ()? А если LastOpenTicket (int number, int digit, int anotherone), то все это тоже помещается в скобки функции GetLots, например, GetLots (int number, int digit, int anotherone... и любые другие переменные в функции и т.д.)?

 

...

1. Представьте пару скобок {} как "начало" и "конец".

2. Вы не можете писать вложенные функции в mql (pascal позволяет это, а mql нет - вложенные функции будут объявлять функцию в теле других функций. См. здесь : Вложенная функция - Википедия, свободная энциклопедия). Вы можете разместить вызов любой функции в любой части вашего кода

3. вы можете использовать эту форму вызова (прямой вызов, как в вашем примере GetLots (LastOpenTicket())) или вы можете присвоить возврат LastOpenTicket() некоторой переменной и затем использовать ее в качестве аргумента в вызове GetLots().

crsnape@btinternet.com:
Я не уверен в скобках функции и в том, что в них входит.

Если я пишу функцию внутри функции, нужно ли мне заключать имя этой функции в скобки?

Например, если у меня есть функция LastOpenTicket() и она вызывается внутри функции GetLots, нужно ли мне заключить LastOpenTicket() в скобки, как GetLots (LastOpenTicket())?

Также нужно ли мне поместить туда ()? А если это LastOpenTicket (int number, int digit, int anotherone), помещается ли все это в скобки функции GetLots, например, GetLots (int number, int digit, int anotherone... и любые другие переменные в функции и т.д.)?
 

В чем разница между ними? Есть ли она вообще?

double GetLots (int number, int call, int specialcall, int order)

{

и...

double GetLots ()

{

int number;

int call;

int specialcall;

int order;

?

 

...

Первая - это функция, принимающая аргументы

Вторая - функция без аргументов, поэтому вы не можете изменить значения "number", "call", "specialcall" и "order" вне тела функции.

Еще немного полезной информации о декларировании функций можно найти в этой теме: https: //www.mql5.com/en/forum/173005.

crsnape@btinternet.com:
В чем разница между этими двумя? Есть ли она вообще?

double GetLots (int number, int call, int specialcall, int order)

{

и...

double GetLots ()

{

int number;

int call;

int specialcall;

int order;

?
 

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

Я изменил функцию для расчета RiskSize, как вы предложили (я согласен, что теперь это лучшая система), и использовал ее в своей функции GetLots. Вот она:

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

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 (AccountBalance() > AccountFreeMargin())

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

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

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

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

return (LotsLong);

}

Он также жалуется на RiskLong - переменная не определена. Но она определена в функции GetRiskLong, которую она вызывает.

Если трудно помочь только с кодом, который я разместил, могу ли я отправить его вам?

 

...

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

Ошибка, которую вы получаете, связана с тем, что переменные, объявленные внутри функций, "видны" только внутри функций. Не имеет значения, что вы вызываете функцию, которая имеет переменную с указанным вами именем: она локальна только для вызываемой функции, другие части кода не "знают" о ней и не могут получить к ней доступ.

crsnape@btinternet.com:
Я играю с моими функциями последние пару дней и все еще получаю пустые результаты. Я буквально рву на себе волосы.

Я изменил функцию для вычисления RiskSize, как вы предложили (я согласен, что теперь это лучшая система) и использовал ее в моей функции GetLots. Вот она:

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

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 (AccountBalance() > AccountFreeMargin())

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

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

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

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

return (LotsLong);

}

Он также жалуется на RiskLong - переменная не определена. Но она определена в функции GetRiskLong, которую он вызывает.

Если трудно помочь только с кодом, который я разместил, могу ли я отправить его вам?
 
mladen:
First - это функция, принимающая аргументы

Вторая - это функция без аргументов, поэтому вы не можете изменить значения "number", "call", "specialcall" и "order" вне тела функции.

Еще немного полезной информации о декларировании функций можно найти в этой теме: https: //www.mql5.com/en/forum/173005.

Спасибо за это. Значит, если я вызываю функцию GetRisk из функции GetLots, мне нужно поместить переменные функции GetRisk в скобки (...) GetLots, потому что значения вычисляются вне функции GetLots?

 

...

Позвольте мне попробовать этот способ:

2 вопроса (предполагается, что мы знаем текущее состояние счета в $) :

Вопрос 1 : Я готов рискнуть (не знаю)% с (не знаю) пунктами стоп-лосса. Каким должен быть размер моего лота?

вопрос 2 : Я готов рискнуть 1% со стоп-лоссом в 100 пунктов. Каким должен быть размер моего лота?

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

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

Вот еще несколько примеров кодирования функций: https: //en.wikipedia.org/wiki/Function_%28computer_science%29

crsnape@btinternet.com:
Спасибо за это. Значит, если я вызываю функцию GetRisk из функции GetLots, мне нужно поместить переменные функции GetRisk в скобки (...) GetLots, потому что значения вычисляются вне функции GetLots?
Причина обращения: