:) Теперь ошибка 130 появилась. Самое непонятное, что при неправильных стопах (130) он всё-равно выставляет корректные тейки (рассчитанные по ATR), а стопы у меня изначально не заданы... Это как-то можно понять?
Нужна помощь!!! Как из истории выбрать последний убыточный ордер???
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает флаг убыточности последней позиции. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+bool isLossLastPos(string sy="", int op=-1, int mn=-1) {
datetime t;
int i, j=-1, k=OrdersHistoryTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderProfit()<0) return(True);
}
return(False);
}
if (isLossLastPos(NULL, -1, Magic искомого ордера)) {нашли - обрабатываем...}
Передаете в метод в качестве параметров меджик отложенника, и желаемый тралл.
Не могу понять почему ваша функция выдаёт ошибку 1 (забавно: ошибка 1 = ошибок нет, но результат неизвестен) и не тралит. Иногда бывает, что зацепит какой-нить отложенник, но в основном в журнале >>>ERROR1 и будь здоров, не кашляй...
Вызываю так:
//==============================================================================================// Модификация ордеров//============================================================================================== int criterion = TakeProfitATR (1); // Рассчитываем "достаточную" волатильность
if (criterion>=15) trailingOrder(511, 20); // и если она в "норме" - тралим ордера...
//==============================================================================================// Функция для рассчёта Take Profit по ATR//+------------------------------------------------------------------+//| Take from ATR |//+------------------------------------------------------------------+double TakeProfitATR (int tf)
{
double atr =iATR(NULL,tf,14,0);
double mltp =15000;
if (tf==1) mltp=15000;
if (tf==5) mltp=45000;
double tp =MathRound(atr*mltp);
return (tp);
}
Не могу понять почему ваша функция выдаёт ошибку 1 (забавно: ошибка 1 = ошибок нет, но результат неизвестен) и не тралит. Иногда бывает, что зацепит какой-нить отложенник, но в основном в журнале >>>ERROR1 и будь здоров, не кашляй...
Вызываю так:
Ошибка 1 может появляться из за этого(из док. про OrderModify()):
Если в качестве параметров функции передать неизмененные значения, то в этом случае будет сгенерирована ошибка 1 (ERR_NO_RESULT).
Так что ничего страшного, это нормально, ошибки действительно нет, можно игнорировать.
Не могу понять почему ваша функция выдаёт ошибку 1 (забавно: ошибка 1 = ошибок нет, но результат неизвестен) и не тралит. Иногда бывает, что зацепит какой-нить отложенник, но в основном в журнале >>>ERROR1 и будь здоров, не кашляй...
Вызываю так:
Добавил Limit`ордера(в прошлом коде забыл про них :))) + обработку ошибки №1 (перед модификацией новая цена сравнивается с текущей, если одинаковые, то ничего не делать):
//+------------------------------------------------------------------+void trailingOrder(int magic, int trailing){
int index = 0;
while(trailing > 0 && OrdersTotal() != 0 && OrderSelect(index, SELECT_BY_POS)){
if(OrderMagicNumber() == magic){
if(OrderType() == OP_BUYSTOP){
if(OrderOpenPrice() - Ask > Point*trailing){
if((Ask+Point*trailing) - Ask >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
(Ask+Point*trailing) - Ask > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
(Ask+Point*trailing) != OrderOpenPrice()){
if(!OrderModify(OrderTicket(),Ask+Point*trailing,OrderStopLoss(),OrderTakeProfit(), 0))Print(">>> ERROR ", GetLastError());
}else{
Print(">>> Слишком близко к рынку или передано неизмененное значение!");
}
}
return;
}
if(OrderType() == OP_SELLSTOP){
if(Bid - OrderOpenPrice() > Point*trailing){
if(Bid - (Bid-Point*trailing) >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
Bid - (Bid-Point*trailing) > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
(Bid-Point*trailing) != OrderOpenPrice()){
if(!OrderModify(OrderTicket(),Bid-Point*trailing,OrderStopLoss(),OrderTakeProfit(), 0))Print(">>> ERROR ", GetLastError());
}else{
Print(">>> Слишком близко к рынку или передано неизмененное значение!");
}
}
return;
}
if(OrderType() == OP_SELLLIMIT){
if(OrderOpenPrice() - Bid > Point*trailing){
if((Bid+Point*trailing) - Bid >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
(Bid+Point*trailing) - Bid > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
(Bid+Point*trailing) != OrderOpenPrice()){
if(!OrderModify(OrderTicket(),Bid+Point*trailing,OrderStopLoss(),OrderTakeProfit(), 0))Print(">>> ERROR ", GetLastError());
}else{
Print(">>> Слишком близко к рынку или передано неизмененное значение!");
}
}
return;
}
if(OrderType() == OP_BUYLIMIT){
if(Ask - OrderOpenPrice() > Point*trailing){
if(Ask - (Ask-Point*trailing) >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
Ask - (Ask-Point*trailing) > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
(Ask-Point*trailing) != OrderOpenPrice()){
if(!OrderModify(OrderTicket(),Ask-Point*trailing,OrderStopLoss(),OrderTakeProfit(), 0))Print(">>> ERROR ", GetLastError());
}else{
Print(">>> Слишком близко к рынку или передано неизмененное значение!");
}
}
return;
}
}
index++;
}
}
//+------------------------------------------------------------------+
Да.
Это как-то можно понять?
Нужна помощь!!! Как из истории выбрать последний убыточный ордер???
Что то у вас все слишком сложно :))
Передаете в метод в качестве параметров меджик отложенника, и желаемый тралл.Вот мой код
Не могу понять почему ваша функция выдаёт ошибку 1 (забавно: ошибка 1 = ошибок нет, но результат неизвестен) и не тралит. Иногда бывает, что зацепит какой-нить отложенник, но в основном в журнале >>>ERROR1 и будь здоров, не кашляй...
Вызываю так:
Не могу понять почему ваша функция выдаёт ошибку 1 (забавно: ошибка 1 = ошибок нет, но результат неизвестен) и не тралит. Иногда бывает, что зацепит какой-нить отложенник, но в основном в журнале >>>ERROR1 и будь здоров, не кашляй...
Вызываю так:
Ошибка 1 может появляться из за этого(из док. про OrderModify()):
Если в качестве параметров функции передать неизмененные значения, то в этом случае будет сгенерирована ошибка 1 (ERR_NO_RESULT).
Не могу понять почему ваша функция выдаёт ошибку 1 (забавно: ошибка 1 = ошибок нет, но результат неизвестен) и не тралит. Иногда бывает, что зацепит какой-нить отложенник, но в основном в журнале >>>ERROR1 и будь здоров, не кашляй...
Вызываю так:
Добавил Limit`ордера(в прошлом коде забыл про них :))) + обработку ошибки №1 (перед модификацией новая цена сравнивается с текущей, если одинаковые, то ничего не делать):
Да кстати, нашел ошибку в Учебнике по поводу дистанций StopLevel и FreezeLevel для отложенников:
Ограничение по минимальной дистанции StopLevel.
Торговая операция не осуществляется, если нарушено любое из указанных требований.
SellLimit ставится выше текущей цены, по этому правильно так:
OpenPrice - Bid ≥ StopLevel
есть ли способ сортировать инструменты в закладках внизу экрана? а то 8 инструментов в 4 таймфреймах раскиданы в беспорядке....
есть ли способ сортировать инструменты в закладках внизу экрана? а то 8 инструментов в 4 таймфреймах раскиданы в беспорядке....
зацепите мышкой закладку с наименованием графика и перетащите в нужное место