советник - разные вопросы - страница 13

 

Вы можете написать функцию следующим образом:

void DrawLabel(string name, string text, int x, int y, int fontsize=10)

Если вы вызовете ее без конечного значения, будет использовано значение по умолчанию, т .е. fontsize будет равен 10

DrawLabel("MyLabel","Hello,World!",50,50); // final parameter not passed (default value used)

Или вы можете явно переопределить значение fontsize по умолчанию:

DrawLabel("MyLabel","Hello,World!",50,50,24); // fontsize parameter is 24

Это то, что вы имеете в виду?

 
honest_knave:

Это то, что вы имеете в виду?

Возможно, мой английский не позволяет понять ваш комментарий.
Спасибо за ваш комментарий.
Если я правильно понимаю, то я понимаю вас следующим образом: Я могу написать 1 функцию Void для Label, и я могу использовать ее двумя методами, как показано ниже. (Я могу использовать одну функцию Void для объекта label с параметром размера шрифта и без него, это правильно? )

DrawLabel("MyLabel","Hello,World!",50,50);    // #1
DrawLabel("MyLabel","Hello,World!",50,50,24); // #2

Итак, я хотел бы сказать, что я потратил несколько часов на этот объект электронной таблицы, чтобы понять, откуда взялась эта проблема и как я могу ее решить.
Итак, я чувствую, что это происходит из кода ниже, а не из функций Label, потому что у меня было 2 функции Label, я удалил одну из них, индикаторы цен Bid и Ask (рыночные цены) по-прежнему работают хорошо, но электронная таблица не работает с функцией Label. Электронная таблица хорошо работает без функции Label.

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

double  spread                                                 ;
        spread       = MarketInfo  ( symbol, MODE_SPREAD ) / 10;
        spreadstring = DoubleToStr ( spread, 1           )     ;

Спасибо за все.

 

Хорошей практикой является проверка того, что то, что вы пытаетесь создать, действительно создается.

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

Или, например, ошибка 4200 покажет, что объект, который вы пытаетесь создать, уже существует.

Это важно, если вы пытались присвоить объекту различные значения, новые значения не будут присвоены, если создание не удастся.

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

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

Если вы пишете функцию void, она ничего не возвращает, поэтому вы не можете проверить результат, анализируя то, что возвращается при ее вызове.

Но вы также можете просто проверить в самой функции и поднять простое предупреждение, если что-то пошло не так.

Если вы так сделаете, то не увидите этих предупреждений в обычном режиме, но когда что-то пойдет не так, это сразу укажет вам на проблему.


Во втором случае вы можете опустить хотя бы некоторые параметры, если сделаете это, то функция примет значения по умолчанию.

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

Размер шрифта - хороший пример, когда вы не указываете его, он будет просто использовать настройки по умолчанию.

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

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

Я не уверен, что вы хотите сделать с spreadstring, возможно, вы можете объяснить немного больше, для чего он нужен и как вы хотите его использовать?

 
Marco vd Heijden:

Я не уверен, что вы хотите сделать со спредом, может быть, вы можете объяснить немного больше, для чего он нужен и как вы хотите его использовать?

Я использую Label Object Function для Bid, Ask, Spreadsheet и так далее. Все работает отлично, без спреда - и я удалял и переписывал его, никаких хороших эффектов.

После того, как я использую @honest_knave метод ошибок код для описания ошибки. Я больше не вижу никаких предупреждений 4200.
Как я уже говорил, я использую'Spreadsheet' в двух местах, #1 в функции Init() - #2 в функции OnTick(), но я также использую Bid, Ask в двух местах с 'Spreadsheet', они не имеют никаких ошибок, предупреждений. Но эта таблица не выдает мне никаких предупреждений, но и не обновляется.

Создание абсолютно успешно, никаких ошибок, никаких предупреждений, для любых объектов, в кодах моего советника.

Я не знаю, я хороший кодер или что?! (Я не считаю себя кодером или программистом.) Но я вижу результат. Поэтому я могу использовать только объект Label (без функции, просто для электронной таблицы).

Функция Void возвращает результаты, которые я хочу, также эта функция создает объект для начального значения спреда, но не обновляет его.



Я не уверен, что вы хотите сделать со строкой spreadstring, может быть, вы можете объяснить немного больше, для чего она нужна и как вы хотите ее использовать?

Хорошо, я просто хочу использовать его следующим образом: Просто я хочу, чтобы он давал мне размер спреда ( / значение ), когда я открываю / добавляю советника на график на данный момент. Потом я попробую написать код для текущих часовых размеров ( / значений ) спреда High / Low.

Заранее спасибо.

 

Вы также можете хранить его в массиве double array[] и затем сравнить их все, чтобы увидеть, где наименьший разброс.


double spread[];
--

ArrayResize(spread,SymbolsTotal(1),0);
   for(int i=0;i<SymbolsTotal(1);i++)
     {
      spread[i]=MarketInfo(SymbolName(i,1),13);
     }
 

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

{
    Print(__FUNCTION__, ": failed to create text label! Error code = ", GetLastError());
    return(false);
}

Я просто сохраняю приведенный ниже код для функции Label Object.

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) ) 

Заранее спасибо.

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

 

Удалите "return(false)", но сохраните оператор Print и запустите свой код.

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

 
honest_knave:

Удалите "return(false)", но сохраните оператор Print и запустите свой код.

ЧТО ЗА ЧЕРТ!
Эта
хрень заняла у меня несколько часов, я не знаю, что я могу сказать по этому поводу.
Могу ли я удалить это из всех моих функций Objects?
Также можете ли вы сообщить мне, как это работает?

return(false);

Просто спасибо.

 
Max Enrik:

ЧТО ЗА ЧЕРТ!
Могу ли
я удалить это из всех моих функций Objects?

Да, но лучше было бы оставить его и устранить источник ошибки.

Макс Энрик:

ЧТО ЗА ЧЕРТ!
Также
не могли бы вы сообщить мне, как это работает?

return(false);

Оператор return просто говорит функции немедленно выйти. Если функция возвращает значение (в вашем случае это bool), вы также должны вернуть значение.

Вы избавитесь от ошибки (4200, верно?), если перед созданием объекта проверите, существует ли он.

Return Operator - Operators - Language Basics - MQL4 Reference
Return Operator - Operators - Language Basics - MQL4 Reference
  • docs.mql4.com
Return Operator - Operators - Language Basics - MQL4 Reference
 
honest_knave:

Спасибо за ваши четкие комментарии.

Я уже заменил его на ваш метод, как показано ниже. (для функции Label Object )

Было - до ваших комментариев по поводу описания ошибки:

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    Print( __FUNCTION__, ": failed to create text label! Error code = ", GetLastError() );
    return(false);
}

// which one this code gives me error no: 4200 

после:

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false);
}

// prevent error no: 4200 - but was not update spreadsheet values 

Теперь - и работает отлично:

if( !ObjectCreate( chart_ID, name, OBJ_LABEL, sub_window, 0, 0 ) )
{
    if( errorcode !=0 ) printf( "Error %i: %s", errorcode, ErrorDescription( errorcode ) );
    return(false); // removed this line
}

// now spreadsheet values updates, no any more error no: 4200 

Всего вам наилучшего.
Причина обращения: