Спасибо за ответ. Сам удивился, что такой вопрос вообще возник. Хотя, может быть я не так понял то, что увидел и что стало причиной вопроса.
Я сейчас смотрю чужой код, чтобы увидеть, какими способами (отличными от моих и, возможно, более эффективными) реализуются те или иные алгоритмы. Сейчас я смотрю на пресловутый советник Ilan 1.6 (приложен). Видно, что его собирали из разных кусков, а потом пересобирали. Но там в строке 337 объявлена пользовательская функция трейлингстопа (хотя флаг его использования и обнулён принудительно в самом начале). Вызывается эта функция в строке 52.
Мой вопрос возник из-за того, что вышеупомянутый трейлингстоп модифицирует открытые ордера (а их может быть несколько) по стоплоссу, сохраняя их первоначальный тейкпрофит, НО задавая этим ордерам в качестве цены открытия (второго параметра функции OrderModify) одно и то же значение (AveragePrice, которое расчитывается в строках 173 и 178).
Или при модификации открытого ордера этот параметр (цена открытия) просто не берётся сервером во внимание и цену можно ставить любой?
При модификации рыночной позиции, цена должна быть задана и равняться цене открытия позиции: OrderOpenPrise()
PS Я б на вашем месте не стал искать в этом коде "эффективные алгоритмы" - там похоже чел писал код, не особо-то и понимая, что он там делает...
Alert("Исполнение программы");
double p[100];
int i =0;
int n = OrdersTotal ();
int t =0;
for (i=0; i<=n+1; i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
p[i+1] = OrderProfit(); // р - це прибуток ордера
}
}
for (i=0; i<=n+1; i++)
{
if (p[i+1]>0) // якщо ордер прибутковий, то його
{
Alert("Є прибуток ордер ",i+1);
OrderSelect(i+1,SELECT_BY_POS,MODE_TRADES);
Alert("Маємо помилку ",GetLastError());
Alert("Вибрали ордер ",i+1);
double ld_Price;
if (OrderType() == 0) ld_Price = NormalizeDouble (Bid, Digits);
else ld_Price = NormalizeDouble (Ask, Digits);
OrderClose (OrderTicket(), OrderLots(), ld_Price, 2); // треба зачинити Alert("Маємо помилку ",GetLastError());
Alert("Закрили ордер ",i+1);
if ( OrderType()==OP_BUY) // в залежності від того, якого типу ордер ми зачинили
{
Alert("Ордер типу бай");
OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point); // змінюється порядок відкривання наступних ордерівAlert("Відкрили ордер типу селл");
Sleep(10000);
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
Alert("Відкрили ордер типу бай");
}else
{
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
Alert("Відкрили ордер типу бай");
Sleep(10000);
OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);
Alert("Відкрили ордер типу селл");
}
}
}
Alert("Последняя ошыбка ",GetLastError());
//----return(0);
}
найдіть же ту "глупость" будьте ласкаві, змилуйтесь над людиною, змученою паскалем.
artmedia70: При модификации рыночной позиции, цена должна быть задана и равняться цене открытия позиции: OrderOpenPrise()
Тогда эта функция, по-Вашему, не будет работать? Испытания не проводил, но она, как мне кажется, является частью работающего кода (этот Илан явно пересобирали из чего-то худо-бедно отлаженного). Или всё же корявый код?
Здравствуйте,необходимо написать советник по стратегии 3 свечи.Торговля ведется на ренко графиках которые очищены от шумов рынка.При трех последовательных барах в одном направление открываем ордер на покупку или на продажу,стоп лосс ставим на вершине преведущего бара,после закрытия свечи переносим стоп лосс на преведущий бар
PS Я б на вашем месте не стал искать в этом коде "эффективные алгоритмы" - там похоже чел писал код, не особо-то и понимая, что он там делает...
Да, код весьма специфичный с большим количеством избыточности и не только. Но меня интересует не столько алгоритмы, как таковые, сколько подход к реализации заложенной идеи. Смотрю на общий рисунок, что ли. Что вынесено в отдельные функции, как реализован тот же трейлинг в отличие от моего и т.п. Я самоучка и мне это просто полезно :)
стоит например ордер в месте 1200 пунктов уже.. а цена например опускалась опускалась а звезды выстроились так что в этом месте нужно поставить ордер.. а ордер уже стоит и чтобы не опускать баланс ниже нужного чтоб не ставить 2 ордера по единичке допустим
Тогда эта функция, по-Вашему, не будет работать? Испытания не проводил, но она, как мне кажется, является частью работающего кода (этот Илан явно пересобирали из чего-то худо-бедно отлаженного). Или всё же корявый код?
Уважаемые господа программисты, если у кого-то есть пару свободных минут отзовитесь пожалуйста. суть вопроса такая. Хочу переделать стандартного советника MACD simple, но в программировании я полный 0.
А поменять хочу чтобы советник советник работал не с одним ордером а с сеткой, стопом и маджиком.
Вот переменные которые хотел добавить:
Stoploss = располагается на одном уровне для всей сетки, например равен по евре/дол = 200пп. и располагается на уровне 1,3450 для всех ордеров в сетке
МахOpenOrder = максимальное кол-во ордеров в сетке, например если=3, то в сетке макс. к-во ордеров будет 3
Dist = расстояние между ордерами (отложки)
Lommultiplicator = коэффициент увеличения лота следующего ордера сетки.
Magic= магический номер
Выход из сделки осуществляется как в исходном коде, т.е. все ордера сетки закрываются в момент закрытия 1-го ордера.
Вот собственно и все
Если кто отзовется буду весьма благодарен!!!
Может у кого есть уже т.к. воплощенный в жизнь готовый советник, тоже подойдет.
стоит например ордер в месте 1200 пунктов уже.. а цена например опускалась опускалась а звезды выстроились так что в этом месте нужно поставить ордер.. а ордер уже стоит и чтобы не опускать баланс ниже нужного чтоб не ставить 2 ордера по единичке допустим
Как-то так:
//+----------------------------------------------------------------------------+bool ExistOrdersByPrice(string sy, int op, int mn, double pp) {
int i, k=OrdersTotal()-1;
for (i=k; i>=0; i--) {
if (OrderSelect(i,SELECT_BY_POS)) {
if (OrderMagicNumber()!=mn) continue;
if (OrderSymbol()!=sy) continue;
if (OrderType()!=op) continue;
if (MathAbs(OrderOpenPrice()-pp)<0.5*Point) return(true);
}
elsePrint("FUNC ExistOrdersByPrice() : ошибка выбора ордера "+GetLastError());
}
return(false);
}
//+----------------------------------------------------------------------------+
Чтобы проверить, есть ли на текущем символе ордер BuyStop по цене 1.35000 с магиком Magic, вызываем функцию:
//+----------------------------------------------------------------------------+if (!ExistOrdersByPrice(Symbol(), OP_BUYSTOP, Magic, 1.35000)) {
// тут код, если нет такого ордера
}
else {
// тут код, если есть такой ордер
}
//+----------------------------------------------------------------------------+
Конечно спасибо, но если лень прочитать вопрос, то смысл тогда вообще отвечать ? В двух функциях которые есть для работы с уровнями в индикаторе я могу изменить их значение, толщину, цвет и стиль. А вот к описанию доступа у меня нет. Повторюсь знает ли кто ответ. Может сталкивался ?
Спасибо за ответ. Сам удивился, что такой вопрос вообще возник. Хотя, может быть я не так понял то, что увидел и что стало причиной вопроса.
Я сейчас смотрю чужой код, чтобы увидеть, какими способами (отличными от моих и, возможно, более эффективными) реализуются те или иные алгоритмы. Сейчас я смотрю на пресловутый советник Ilan 1.6 (приложен). Видно, что его собирали из разных кусков, а потом пересобирали. Но там в строке 337 объявлена пользовательская функция трейлингстопа (хотя флаг его использования и обнулён принудительно в самом начале). Вызывается эта функция в строке 52.
Мой вопрос возник из-за того, что вышеупомянутый трейлингстоп модифицирует открытые ордера (а их может быть несколько) по стоплоссу, сохраняя их первоначальный тейкпрофит, НО задавая этим ордерам в качестве цены открытия (второго параметра функции OrderModify) одно и то же значение (AveragePrice, которое расчитывается в строках 173 и 178).
Или при модификации открытого ордера этот параметр (цена открытия) просто не берётся сервером во внимание и цену можно ставить любой?
При модификации рыночной позиции, цена должна быть задана и равняться цене открытия позиции: OrderOpenPrise()
PS Я б на вашем месте не стал искать в этом коде "эффективные алгоритмы" - там похоже чел писал код, не особо-то и понимая, что он там делает...
найдіть же ту "глупость" будьте ласкаві, змилуйтесь над людиною, змученою паскалем.
При модификации рыночной позиции, цена должна быть задана и равняться цене открытия позиции: OrderOpenPrise()
Тогда эта функция, по-Вашему, не будет работать? Испытания не проводил, но она, как мне кажется, является частью работающего кода (этот Илан явно пересобирали из чего-то худо-бедно отлаженного). Или всё же корявый код?
PS Я б на вашем месте не стал искать в этом коде "эффективные алгоритмы" - там похоже чел писал код, не особо-то и понимая, что он там делает...
В нужном месте - это в каком?
стоит например ордер в месте 1200 пунктов уже.. а цена например опускалась опускалась а звезды выстроились так что в этом месте нужно поставить ордер.. а ордер уже стоит и чтобы не опускать баланс ниже нужного чтоб не ставить 2 ордера по единичке допустим
Тогда эта функция, по-Вашему, не будет работать? Испытания не проводил, но она, как мне кажется, является частью работающего кода (этот Илан явно пересобирали из чего-то худо-бедно отлаженного). Или всё же корявый код?
Ну... код не для реала. По-крайней мере.
Lommultiplicator = коэффициент увеличения лота следующего ордера сетки.
Magic= магический номер
Выход из сделки осуществляется как в исходном коде, т.е. все ордера сетки закрываются в момент закрытия 1-го ордера.
стоит например ордер в месте 1200 пунктов уже.. а цена например опускалась опускалась а звезды выстроились так что в этом месте нужно поставить ордер.. а ордер уже стоит и чтобы не опускать баланс ниже нужного чтоб не ставить 2 ордера по единичке допустим
Как-то так:
Чтобы проверить, есть ли на текущем символе ордер BuyStop по цене 1.35000 с магиком Magic, вызываем функцию:
Если речь о документации то выделите слово в MetEditor и нажмите F1. Либо в инете, Например:
https://docs.mql4.com/ru/customind/SetLevelStyle
Конечно спасибо, но если лень прочитать вопрос, то смысл тогда вообще отвечать ? В двух функциях которые есть для работы с уровнями в индикаторе я могу изменить их значение, толщину, цвет и стиль. А вот к описанию доступа у меня нет. Повторюсь знает ли кто ответ. Может сталкивался ?
Прилепил картинку чтобы было видно что мне надо.