Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 132

 
MarkTrade:


Так работает... Спасибо!

Только вот понять бы, почему мой вариант работать не хочет...

А вы не видите разницы? У вас неверное сравнение.

if (a && b < c) - так нельзя

if (a<c && b<c) - так можно

 
artmedia70:

А вы не видите разницы? У вас неверное сравнение.

if (a && b < c) - так нельзя

if (a<c && b<c) - так можно



Нет, разницу я заметил. Просто я свято верил что можно и так if (a && b < c)... :-)

Теперь буду знать, Спасибо!

 
MarkTrade:


Нет, разницу я заметил. Просто я свято верил что можно и так if (a && b < c)... :-)

Теперь буду знать, Спасибо!

Может Вы хотели так: if(a+b < c) ? Тогда так можно!
 
skyjet:


Спасибо еще раз! Теперь попытался сделать количество "проверяемых" баров оптимизируемым, но результатов в окне просто нет. Пробовал начинать подсчет и с начала и с конца, но тщетно.

extern int number=3;
//------------------------------------+
for (int x=number; x>1; x--) // x>1 (а не x>=1)
{
if(Open[x]==Open[x-1]) continue;
if(Open[x]<Open[x-1])
   {
    //--- action 1
   }
else
   {
    //--- action 2
   }
}

Что значит "...результатов в окне просто нет". Может как-то неправильно выводите результат в окно и в другом месте програмы есть ошибка?

 

Уважаемые товарищи! Подскажите есть ли какая литература(учебники) по программированию линий на основе технического анализа, в т.ч. уровней фибо. Желательно с примерами программного кода "для чайников".

Или кто подскажет подобный советник с открытым кодом.

Заранее благодарен.

 
alexey1979621:

Уважаемые товарищи! Подскажите есть ли какая литература(учебники) по программированию линий на основе технического анализа, в т.ч. уровней фибо. Желательно с примерами программного кода "для чайников".

Или кто подскажет подобный советник с открытым кодом.

Заранее благодарен.

А чем не учебник этот Учебник ? Всё, что Вам нужно, изучайте, практикуйте! Успехов!
 
artmedia70:
Вы понимаете и видите, что содержится в вашем массиве сразу после его "заполнения" данными об ордерах? Нет. Не знаете, а только предполагаете. РАСПРИНТУЙТЕ содержимое всех ячеек массива, не вашей pr(), а стандартным Print() и потрудитесь заглянуть в журнал тестера и увидеть, чего ж там у вас в массиве находится, в каждой его ячеечке, сразу после его заполнения. Вот когда точно будете знать, что содержание массива соответствует вашим представлениям о его содержимом, вот тогда и принтуйте его своей pr(). Если она вам выдаст не те же результаты - дело в ней, в вашей pr(), если данные будут совпадать, значит ищите ошибку дальше, на следующем этапе.

Массивы принтовал, но, на данный момент, дело не в них. Ниже опишу что я думаю.

Кстати. Перевёл всё выводы на стандартный принт. Ситуация та же. Появляется момент, когда закрывается 4 позиции в +. И дальше по логике в старт должна отработать функция isCloseByTakeLastOpenPos(), которую вызываю со старта так:

 for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() == 6) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (isCloseByTakeLastOpenPos(2))        // Наша функция, определяющая.. закрылся ли последний закрытый ордер в + или нет.
      {
         // if (g_type < 2)
          {
              ClosePosBySortLots();
          }
          //else
          if (g_type > 1 && g_type < 6)
          {
              DeletePendingOrders(g_ticket);
          }
      }
   }

которая сообщит нам, что последний закрытый ордер - закрыт по тейку или с профитом. Функция вот:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -1;
   Print ("isCloseByTakeLastOpenPos: вошли в функцию");
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
      Print ("isCloseByTakeLastOpenPos: первоначальные условия выполнены!");

      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         j = i;
         Print ("j = " + j + "   " + TimeToStr(TimeCurrent()));
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
//      pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
  //    pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + "   " + TimeToStr(TimeCurrent()));
      if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
                 "\n", "j = ", j,
                 "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
      }
   }
   else
   {
      Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
              "\n", "j = ", j,
              "\n", "не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   Print ("isCloseByTakeLastOpenPos: последняя закрытая позиция профитна!");
   
   return (true);
}

Ситуация интересна. Всё работает. И вот появляется ситуация:

Видно, что закрытом 4 позы по тейку в +. Закрылись они по тейку. Т.е. функции закрывающие ордера не работали вообще. Причина по ходу кроется в том, что не сработало условие для закрытия. А это:

 if (isCloseByTakeLastOpenPos(2))

Заглянув в эту функцию и принтанув всё становится понятно, что в данный момент она не стала истинной. Как так? Ведь крайние 4 ордера в + закрылись. Код функции я привёл выше. Вот что есть в журнале в тот же момент:

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:23 2013.08.15 12:35 Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #104 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #102 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #100 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:04 2013.08.15 12:30 Tester: take profit #98 at 1.32731 (1.32722 / 1.32724)

2013.09.09 00:13:03 2013.08.15 12:30 Tester: order #104, sell 0.93 EURUSD.GI is opened at 1.32831

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: j = 74 2013.08.15 12:30

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: вошли в функцию

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!

2013.09.09 00:13:03 2013.08.15 12:30 Perevorot EURUSD.GI,M5: isCloseByTakeLastOpenPos: первоначальные условия выполнены!


Видно, что условие не отработало. Что здесь не так?

 
Подскажите, есть индикатор, который определяет спред на всем графике или возможно ли это осуществить? Нашел только индикатор, который записывает спред при включенном терминале с момента подключения.
 
paladin80:

Что значит "...результатов в окне просто нет". Может как-то неправильно выводите результат в окно и в другом месте програмы есть ошибка?


Но ведь я сравниваю 3,2 и 1 бары, то есть подсчет упирается в x >=1?

И значит ли continue, что бары с совпадающей ценой просто не учитываются, им не присваиваются номера?

Задав оптимизационные параметры: начало 1, шаг 1, конец 4; на Н1 и Н4 вкладка результатов просто пуста, на D1 одинаковая прибыльность при разном кол-ве анализируемых баров.

if(Open[x]==Open[x-1]) continue;
 

Профи без вас ни куда.

Помогите с функцией. Которая считает последнее количество убыточных ордеров в истории до плюсового ордера.

то есть в истории 3 последних ордера в минус потом 1 в плюс и 2 в минус.

вот функция должна посчитать три последних (до плюсового)

Причина обращения: