помогите найти буфер в данном индикаторе для iCustom
В этом индикаторе буферы не используются..
От xbms, 13 апреля, 2013 в Уголок Программиста
помогите найти буфер в данном индикаторе для iCustom
помогите найти буфер в данном индикаторе для iCustom
В этом индикаторе буферы не используются..
помогите найти буфер в данном индикаторе для iCustom
В этом индикаторе буферы не используются..
как мне задать чтобы сов видел лини или открывал ордера на касании линий? :-?
помогите найти буфер в данном индикаторе для iCustom
Изменено 6 апреля, 2016 пользователем mahahuha
приветствую всех.
Есть индикатор который строит линию по данным из файла CSV. Если кинуть его на график, работает, а в тестере никак не хочет ни линию рисовать, ни буфер для советника выгружать. Что делать, чтобы в тестере отображалась полоса.
Код прикрепляю. Сразу скажу, код не мой. Я его только откомпилировал под новый билд МТ4
привет,может кто нибудь написать кусок кода который закрывает все отложенные ордера,при закрытии по тейк - профиту последнего ордера
привет,может кто нибудь написать кусок кода который закрывает все отложенные ордера,при закрытии по тейк - профиту последнего ордера
//+------------------------------------------------------------------+
//+ Функция удаления всех отложенных ордеров если последний закрыт в плюс.
//+------------------------------------------------------------------+
bool LastProfitDeleteAll(string aSymbol="",int aMagic=0)
{
if(aSymbol=="")aSymbol=Symbol();
int time=0; double his_profit=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
if(OrderSymbol()==aSymbol)
if(OrderMagicNumber()==aMagic)
if(OrderCloseTime()>time)
{
time = (int)OrderCloseTime();
his_profit = OrderProfit();
}
// ---
if(time>0 && his_profit>0)
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(i,SELECT_BY_POS))
if(OrderSymbol()==aSymbol)
if(OrderMagicNumber()==aMagic)
if(OrderType()>1)
if(!OrderDelete(OrderTicket()))
{
Print("Error N ",GetLastError());
return false;
}
return true;
}
//+------------------------------------------------------------------+Парни, новая задачка (для кого-то старая :)):
Есть мультивалютный сеточник, торгующий по сигналам на разных парах (несколько копий советника на разных парах), ну подобие ApM Grid. В советнике есть контроль максимума одновременно открытых в работе валютных пар, также есть контроль направления валют (например, если открыта покупка EURUSD, то сигналы по другим парам на продажу USD игнорируем.)
При резком движении одной валюты, может возникать одновременный сигнал по разным валютным парам, как например сегодня по канадцу - с разницой в секунду сработали OrderSend по USDCAD, AUDCAD и NZDCAD. Естественно, блоки контроля отработать не успели, одновременно открылись три пары в одном направлении.
Вопрос - есть ли эффективное решение, позволяющее контролировать такие ситуации? Как-то создать очередь в запросах, ввести таймер на открытие или что-то еще?
Парни, новая задачка (для кого-то старая :)) :
Есть мультивалютный сеточник, торгующий по сигналам на разных парах (несколько копий советника на разных парах), ну подобие ApM Grid. В советнике есть контроль максимума одновременно открытых в работе валютных пар, также есть контроль направления валют (например, если открыта покупка EURUSD, то сигналы по другим парам на продажу USD игнорируем.)
При резком движении одной валюты, может возникать одновременный сигнал по разным валютным парам, как например сегодня по канадцу - с разницой в секунду сработали OrderSend по USDCAD, AUDCAD и NZDCAD. Естественно, блоки контроля отработать не успели, одновременно открылись три пары в одном направлении.
Вопрос - есть ли эффективное решение, позволяющее контролировать такие ситуации? Как-то создать очередь в запросах, ввести таймер на открытие или что-то еще?
Изменено 9 апреля, 2016 пользователем Qj
JR Вы в МТ4 торгуете? а то Qj про мультипоточность читать отправляет... Qj уже пора?
JR "с разницой в секунду" и "одновременно" - сильно разные понятия. В МТ4 совы должны работать в одном потоке последовательно ( очерёдность может быть разной ), т.е. следующая сова должна знать об открытии ордера предыдущей.
JR Вы в МТ4 торгуете? а то Qj про мультипоточность читать отправляет... Qj уже пора?
JR "с разницой в секунду" и "одновременно" - сильно разные понятия. В МТ4 совы должны работать в одном потоке последовательно ( очерёдность может быть разной ), т.е. следующая сова должна знать об открытии ордера предыдущей.
JR Вы в МТ4 торгуете? а то Qj про мультипоточность читать отправляет... Qj уже пора?
JR "с разницой в секунду" и "одновременно" - сильно разные понятия. В МТ4 совы должны работать в одном потоке последовательно ( очерёдность может быть разной ), т.е. следующая сова должна знать об открытии ордера предыдущей.
что-то вы как-то все усложняете.
1. Понятное дело что все работает в одном потоке и одновременное открываться ордера не могут вобще в принципе, торговый поток один, я так понимаю все ордерсенды просто ставятся в очередь и обрабатываются при первой же возможности(говоря языком многопоточности - когдра ресурс освобожден предыдущим запросом)
2. Я пишу давно уже мультивалютные совы, все пары обрабатываются у меня в одном коде. Сложность обработки больших объемов данных(допустим пар 24) решается динамическим массивом структур, где элемент массива - это структура, в которой хранится все, что нужно по единичной паре, обязательным условием(как я считаю), нужно хранить еще в этой структуре имя символа, чтобы не запутаться в циклах. В ините заполняем этот массив стурктур как минимум запоминая символ.
То есть сама структура будет выглядеть как минимум вот так вот
struct am{
string sym;
................// остальные нужные элементы
int countBUY;
int countSELL;
int curCountOrders;
int preCountOrders;
int timeprev;
double preClose;
double curClose;
double preRSI;
double curRSI;
double distance;
double lastprice;
};
сам массив объявлется тоже очень просто:
am MainBase[];
вот и всё.
При обращении нужно помнить на каком элементе в массиве мы остановились, ну и вызов будет более сложным с точки зрения абстракций. Например MainBase[j].preRSI, где перед этим проверям в цикле что в MainBase[j].sym равен нужному нам символу.
Вобще это в одном из видеоуроков поднималось если мне память не изменяет.
Если изгаляться разным кодом сов в одном терминале, то связку, как мне кажется, лучше делать через глобальную переменную-флаг, ну типа если что-то в одном коде творится с ордерами, переводить глобальную переменную в определенное состояние, другими совами постоянно читать эту переменную, и стопить их операции если флаг сброшен, как только первая сова доделала все свои танцы с бубмно - переводить глобальную переменную в обратное состояние.
Но тут опять же возникает очень много вопросов как это все будет работать в нормальном понимании многопоточного программирования. Первый код может освободать флаг и занимать его снова, вторые/третьи совы могут не успевать подхватывать изменение состояния флага и т.п. Как вариант, после освобождения флага делать задержку по времени в первом коде, чтобы вторая/третья сова успевала взять контроль на себя(причем чтобы уж совсем путанциы не было, например можно привязывать значение глобальной переменной занятость определенным кодом, ну например если равно ноль - флаг свободен, можно работаь первому коду, присваиваем переменной значение 1, остальные совы будут знать что 1 - это значит работает первый сов, если цифра два - второй сов, ну и так далее).
Вопрос про оредрсенд предыдущей совы - можно решить чтением комментария ордера(в коммент пихаем номер совы например), но и тут мы можем напороться на баг - ордерсенд первой совы отправил запрос на сервер брокера, вторая сова в коде прочитала все ордера и открытого предыдущей совой оредра не увидела, так как сервер брокера ордер еще не открыл, и тут вторая сова посылает свой запрос на открытие ордера - вуаля, получили баг. Как решить - опять же можно каждым ордерсендом засирать глобальные перменные и совами читать их.
Других идей у меня нет >:d
Изменено 9 апреля, 2016 пользователем dermitay
Изменено 9 апреля, 2016 пользователем 0ll
JR следующая сова должна увидеть уже открытый ордер в списке. Но придётся на каждом тике вызывать функцию пересчёта ордеров. Если контроль сова делала на каждом тике - отпишись.
0ll, ты хочешь сказать что когда вызывается функция OrderSend(...) то все потоки всех сов стопятся и "ждут" ответа сервера?
что-то очень сильно сомневаюсь, я не знаю как насчет "тиков", но если ты код пишешь на "тактах" юзая OnTimer() с мелким таймером(в одну милисекунду) вместо OnTick(), то параллельные коды работают и выполняют логику вне зависимости от того что там посылает другой код. мой опыт основан на связках досок с FF плюс мои совы и вся эта каша в одном терминале. ОнТаймеру пофигу на тики вобще(и честно я не понимаю почему народ пишет код сов именно до сих пор на ОнТиках, это же архаизм по сути: ждать тика брокера по паре на которой брошен сов, чтобы прогнать свой код, а при мультиторговле так это вобще неадекватный крайне медленный обсчет всей кучи инфы по всем парам и огромная задержка при принятии решений логики кода).
voldemar227 иногда это будет нелегко. С открытием/сопровождением ордеров проблем нет, а вот если входных параметров много и они разные ( для разных пар ) - проблема. Придётся делать 2 совы - одна для тестирования входных параметров по каждой паре, а другая чисто для торговли в мультивалютном режиме. Это я ещё про индикаторных сов не вспоминаю.
Как -то мы обсуждали возможности МТ4 и тогда однозначно решили, что одновременного ( в строгом смысле ) или параллельного открытия ордеров быть не может. Может что-то поменялось... если есть достоверные данные прошу высказать.
Изменено 9 апреля, 2016 пользователем JR
Изменено 9 апреля, 2016 пользователем dermitay
:d Ну а как ещё проверить последовательно совы работают или параллельно?Oll, ты слишком все усложнил
:d Ну а как ещё проверить последовательно совы работают или параллельно?Oll, ты слишком все усложнил
В глобальную переменную я бы написал не просто 1, а направление открытия по валюте. Можно логику выстроить так, что например доллар с еврой продал, а с фунтом купил - диверсификация, однако.
Изменено 9 апреля, 2016 пользователем dermitay
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем