[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 72

 

http://www.soft-sib.ru/articles/programs/10/

Еще одним преимуществом использования СУБД и архитектуры клиент-сервер по сравнению с файл-серверным подходом явилась возможность использовать транзакционный механизм манипулирования данными. Этот сервис, предоставляемый сервером данных, позволяет объединять несколько действий по изменению данных в одну неделимую операцию (транзакцию). Использование транзакций обеспечивает надежную защиту информации от программно-аппаратных сбоев как на клиентской, так и на серверной части ИС.

 
Мда, или я невидимый, или никто не хочет помоч, или не может((
 
PerlOF:


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

Возможен ли вызов специальных функций без подключения к серверу (в принципе)?


Вполне. Собственно сервер нужен для получения тика, который запускает функцию старт()

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

Скрипт может работать в бесконечном цикле, и поэтому тики ему не нужны, тики нужны для индикаторов и советников (в стандартной конфигурации ( так как советник тоже может работать в бесконечном цикле)).

Но тики можно вызвать и искусственно - при помощи ВИНАПИ. Кроме того, есть такая стандартная фича как тестер стратегий (который тоже умеет генерировать тики).

Просто надо включить мозги и ПОИСК ПО САЙТУ (ФОРУМУ).

А не приплетать сюда преимущество или недостатки файл-серверных технологий.

 
MXDEEM:

Здравствуйте, есть такой код, проверка на наличие ордеров, если имеется открытый ордер то проводить проверку повторно и так до тех пор пока ордеров не станет 0. Но эксперт явно игнорирует этот код и открывает бесконечное количество ордеров, подскажите в чем ошибка?

int FunctionBUYnext()
{
int b=OrdersTotal();
if (b>0)
{FunctionBUYnext();}
else {FunctionSELL();}
}



Навигатор по форуму MQL4 community
ПравилаПоискКак оформить постАдминистрация форумаСообщить о нарушенииКлуб Телепатов
Вопросы, которые задавать не надо
Как правильно задавать вопросы
Полезная литератураПолезный софтИщу индикатор (советник, скрипт)
 

Возникла необходимость нарисовать линию в Торговом Советнике используя функцию iCustom.
В качестве теста использовал ЗигЗаг:

for(int cnt=0; cnt<10000; cnt++) {
   double zigzag1=iCustom(NULL,0,"ZigZag",15,0,3,  0,cnt+1);
   if( zigzag1!=0 ) 
      break;
}


Поскольку цель iCustom в моем случае заключается лишь в том чтобы нарисовать линию
(данные индикатора в Советнике не используются), то решил поместить код в deinit(). Но там он не работает и ничего не рисует.
В start()-е все нормально.
1. Почему он не работает в deinit()?
2. Необходимо избежать бессмысленной работы вышеупомянутого кода в процессе тестирования и оптимизации
(не расходовать CPU впустую) и чтобы он запускался лишь на последнем баре тестируемой истории.
- Как этого достичь?
Спасибо!
 
Roll:

код - абсурд.

ПОЧЕМУ?? ВСЕ КАК УЧИЛИ
 
MXDEEM:

ПОЧЕМУ?? ВСЕ КАК УЧИЛИ

Оч странно вас учили...

Где функции, вызываемые из тела вами приведённого "кода" ?

Сам "код" тоже довольно весёлый...

int FunctionBUYnext()
{
int b=OrdersTotal();
if (b>0)
{FunctionBUYnext();}
else {FunctionSELL();}
} 

Используем вызов самой себя... Почему бы не делать просто выход из FunctionBUYnext() при отсутствии ордеров ?

Далее - нет проверки типа ордеров, нет проверки символа и магика...

Я б вашего "учителя" на дыбу отправил бы...

 

Столкнулся с проблемой...

В таком виде скрипт отрабатывает с функцией MessageBox()

//+------------------------------------------------------------------+

#include <WinUser32.mqh>
#import "user32.dll"

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int result = MessageBox("Are you ok?", "Caption",MB_YESNO|MB_ICONQUESTION);
   if(result != IDYES) Alert("Кнопка да не нажата");
//----
   return(0);
  }
//+------------------------------------------------------------------+

А вот с использованием недокументированной функции MessageBoxTimeoutA(), работать отказывается напрочь:

//+------------------------------------------------------------------+

#include <WinUser32.mqh>
#import "user32.dll"

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int result = MessageBoxTimeoutA(0, "Are you ok?", "Caption",MB_YESNO|MB_ICONQUESTION, 0, 10000);
   if(result != IDYES) Alert("Кнопка да не нажата");
//----
   return(0);
  }
//+------------------------------------------------------------------+

Даже окно сообщения с кнопками Yes/No не выводит на экран.

Кто сталкивался - подскажите где тут собака зарыта?

 
artmedia70:

Оч странно вас учили...

Где функции, вызываемые из тела вами приведённого "кода" ?

Сам "код" тоже довольно весёлый...

Используем вызов самой себя... Почему бы не делать просто выход из FunctionBUYnext() при отсутствии ордеров ?

Далее - нет проверки типа ордеров, нет проверки символа и магика...

Я б вашего "учителя" на дыбу отправил бы...

ОБЪЯСНЯЮ СМЫСЛ, ВЫЗЫВАЕТ САМА СЕБЯ ПОТОМУ ЧТО НУЖНА ПРОВЕРКА ИМЕННО В ЭТОЙ ЧАСТИ, ЕСЛИ СДЕЛАТЬ ВЫХОД ОНА ВЕРНЕТСЯ ОПЯТЬ НА ИСПОЛНЕНИЕ START, МНЕ ЭТО НЕ НУЖНО, СИМВОЛ И МАГИК НЕ УЧИТЫВАЕТСЯ, МОЙ УЧИТЕЛЬ ИНТЕРНЕТ))) ЕСЛИ НЕ СЛОЖНО СКИНЬТЕ ЧТО НИБУДЬ ПОДОБНОЕ НО РАБОЧЕЕ, ОСНАВНАЯ ЗАДУМКА - НЕ ПУСКАТЬ ДАЛЬШЕ ЕСЛИ ЕСТЬ ОРДЕРА, ЕСЛИ НЕТ ТО ПРОПУСКАТЬ В ОПРЕДЕЛЕННУЮ ФУНКЦИЮ.

 
MXDEEM:

ОБЪЯСНЯЮ СМЫСЛ, ВЫЗЫВАЕТ САМА СЕБЯ ПОТОМУ ЧТО НУЖНА ПРОВЕРКА ИМЕННО В ЭТОЙ ЧАСТИ, ЕСЛИ СДЕЛАТЬ ВЫХОД ОНА ВЕРНЕТСЯ ОПЯТЬ НА ИСПОЛНЕНИЕ START, МНЕ ЭТО НЕ НУЖНО, СИМВОЛ И МАГИК НЕ УЧИТЫВАЕТСЯ, МОЙ УЧИТЕЛЬ ИНТЕРНЕТ))) ЕСЛИ НЕ СЛОЖНО СКИНЬТЕ ЧТО НИБУДЬ ПОДОБНОЕ НО РАБОЧЕЕ, ОСНАВНАЯ ЗАДУМКА - НЕ ПУСКАТЬ ДАЛЬШЕ ЕСЛИ ЕСТЬ ОРДЕРА, ЕСЛИ НЕТ ТО ПРОПУСКАТЬ В ОПРЕДЕЛЕННУЮ ФУНКЦИЮ.

Ой, да не кричите вы так... Кажется у вас CapsLock залипла... Размер шрифта ещё бы увеличить в два раза, да жирным сделать бы...

Это так... отступление...

Теперь позвольте тоже вам объяснить:

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

Пересмотрите ваш подход к логике советника