Error 1!!! Батва какая-то... - страница 2

 
Hoper23:

Я понимаю, что контроля открытых позиций у меня нет, я просто тупо не знаю, как это реализовать. НАсчет качества открытых позиций даже приблизительного представления не имею. Поделитесь опытом...

   if(OrdersTotal()>0)
   {
      StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
      FreezeLevel=MarketInfo(Symbol(),MODE_FREEZELEVEL);
      for(i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderMagicNumber()!=Magic_№ || OrderSymbol()!=Symbol()) continue;
         
         if(OrderType()==OP_BUY)
         {
            if(Profit!=0)
               TP=NormalizeDouble(OrderOpenPrice()+Profit*Point,Digits);
            if(StopLoss!=0)
               SL=NormalizeDouble(OrderOpenPrice()-StopLoss*Point,Digits);

            if(NormalizeDouble(OrderStopLoss(),Digits)!=SL)
            {
               if(Bid-SL<StopLevel*Point || Bid-SL<=FreezeLevel*Point)
                  continue;

               OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),OrderExpiration(),CLR_NONE);
               Error=GetLastError();
               if(Error>1)
               {
                  Print("Error MODIFY BUY order (SL): ",Error);
               }
            }
            if(NormalizeDouble(OrderTakeProfit(),Digits)!=TP)
            {
               if(TP-Bid<StopLevel*Point || TP-Bid<=FreezeLevel*Point)
                  continue;

               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TP,OrderExpiration(),CLR_NONE);
               Error=GetLastError();
               if(Error>1)
               {
                  Print("Error MODIFY BUY order (TP): ",Error);
               }
            }
         }

         if(OrderType()==OP_SELL)
         {
            if(Profit!=0)
               TP=NormalizeDouble(OrderOpenPrice()-Profit*Point,Digits);
            if(StopLoss!=0)
               SL=NormalizeDouble(OrderOpenPrice()+StopLoss*Point,Digits);

            if(NormalizeDouble(OrderStopLoss(),Digits)!=SL)
            {
               if(SL-Ask<StopLevel*Point || SL-Ask<=FreezeLevel*Point)
                     continue;

               OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),OrderExpiration(),CLR_NONE);
               Error=GetLastError();
               if(Error>1)
               {
                  Print("Error MODIFY SELL order (SL): ",Error);
               }
            }
            if(NormalizeDouble(OrderTakeProfit(),Digits)!=TP)
            {
               if(Ask-TP<StopLevel*Point || Ask-TP<=FreezeLevel*Point)
                  continue;

               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TP,OrderExpiration(),CLR_NONE);
               Error=GetLastError();
               if(Error>1)
               {
                  Print("Error MODIFY SELL order (TP): ",Error);
               }
            }
         }
      }
   }
Пример реализации контроля и модификации позиций...
 
leonid553:

Возможно причина ещё вот в чем.

На WHC в параметрах эксперта стопы ( и параметры трала) нужно задавать кратными количеству пунктов одного тика. Для Дакса, например, кратными 5-ти. Для Насдака, кратными 25-ти и т.п. Либо использовать в коде соотв. функции.

Иначе в журнале будут ошибки стопов и позиции в онлайне не откроются, даже при правильной реализации в условиях Market Watch (тож, кстати с сомнительным исполнением в вашем эксперте) Хотя в тестере всё будет работать!

Если я не ошибаюсь, в ветке И.Кима на 7 страничке есть пример корректной реализации Market Watch

'Полезные функции от KimIV'

У Кима модифер с отложенным ордером, а у меня модифер после каждого открытого ордера только по стопам. Вот как мне нарисовать модифер так, что бы он каждый ордер модифел, а не тупил.  Дело в том, что на ДЦ  WHC стопы нельзя задать при открытии ордера, поэтому приходится модифить. Вобщем мне необходима помошь в модуле модификации и необходимость изменения открытого ордера, контроль колличества открытых позиций. ПА-МА-ГИ-ТЕ!!!

 
kharko:
Hoper23:

Я понимаю, что контроля открытых позиций у меня нет, я просто тупо не знаю, как это реализовать. НАсчет качества открытых позиций даже приблизительного представления не имею. Поделитесь опытом...

   if(OrdersTotal()>0)
   {
      StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
      FreezeLevel=MarketInfo(Symbol(),MODE_FREEZELEVEL);
      for(i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderMagicNumber()!=Magic_№ || OrderSymbol()!=Symbol()) continue;
         
         if(OrderType()==OP_BUY)
         {
            if(Profit!=0)
               TP=NormalizeDouble(OrderOpenPrice()+Profit*Point,Digits);
            if(StopLoss!=0)
               SL=NormalizeDouble(OrderOpenPrice()-StopLoss*Point,Digits);

            if(NormalizeDouble(OrderStopLoss(),Digits)!=SL)
            {
               if(Bid-SL<StopLevel*Point || Bid-SL<=FreezeLevel*Point)
                  continue;

               OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),OrderExpiration(),CLR_NONE);
               Error=GetLastError();
               if(Error>1)
               {
                  Print("Error MODIFY BUY order (SL): ",Error);
               }
            }
            if(NormalizeDouble(OrderTakeProfit(),Digits)!=TP)
            {
               if(TP-Bid<StopLevel*Point || TP-Bid<=FreezeLevel*Point)
                  continue;

               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TP,OrderExpiration(),CLR_NONE);
               Error=GetLastError();
               if(Error>1)
               {
                  Print("Error MODIFY BUY order (TP): ",Error);
               }
            }
         }

         if(OrderType()==OP_SELL)
         {
            if(Profit!=0)
               TP=NormalizeDouble(OrderOpenPrice()-Profit*Point,Digits);
            if(StopLoss!=0)
               SL=NormalizeDouble(OrderOpenPrice()+StopLoss*Point,Digits);

            if(NormalizeDouble(OrderStopLoss(),Digits)!=SL)
            {
               if(SL-Ask<StopLevel*Point || SL-Ask<=FreezeLevel*Point)
                     continue;

               OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),OrderExpiration(),CLR_NONE);
               Error=GetLastError();
               if(Error>1)
               {
                  Print("Error MODIFY SELL order (SL): ",Error);
               }
            }
            if(NormalizeDouble(OrderTakeProfit(),Digits)!=TP)
            {
               if(Ask-TP<StopLevel*Point || Ask-TP<=FreezeLevel*Point)
                  continue;

               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TP,OrderExpiration(),CLR_NONE);
               Error=GetLastError();
               if(Error>1)
               {
                  Print("Error MODIFY SELL order (TP): ",Error);
               }
            }
         }
      }
   }
Пример реализации контроля и модификации позиций...

Это бред, не работает оно. Модифит только buy к тому же без профита. Может и я накосячил ЧаГо... вот что у меня получилось ->

Файлы:
mtfopzo.mq4  6 kb
 

2008.06.01 20:27:04 2008.05.29 06:21 Бульдог EURUSD,M1: OrderModify error 1 (ERR_NO_RESULT 1 Нет ошибки, но результат неизвестен)
2008.06.01 20:27:04 2008.05.29 06:21 Бульдог EURUSD,M1: open #42 sell 0.01 EURUSD at 1.5629 ok

Вот что я вижу на 118 ордере используя свой вариант модификации....Причем все предыдущие ордера до этого были удачно закрыты по профиту...

//+------------------------------------------------------------------+
//| ЗЛАЯ СЦУКА Бульдог.mq4 |
//| Copyright © 20.05.2008, Hoper production. |
//| e-mail: bghoper@mail.ru |
//| Используется Stochastic и OsMA и индикаторы |
//+------------------------------------------------------------------+
#include <stderror.mqh> // Модуль ошибки
#include <stdlib.mqh> // туда же
//---- Параметры ввода
extern double Lots = 0.1; // Объем лотов
extern double TakeProfit = 5; // Стоп по прибыли
extern double TrailingStop = 100; //Стоп по убыткам
int ticket,i;
extern double total=9999; // Колличество открытых ордеров
//+------------------------------------------------------------------+
//| Инициализация индикаторов и выполнение функций |
//+------------------------------------------------------------------+
//Старт
void start()
{
int total=OrdersTotal();
// Вход в рынок
if(iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)>80 && iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0)>80 && iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)<iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0) && iOsMA(NULL,0,12,26,9,PRICE_CLOSE,0)>0.00012)
{
GetLastError();
RefreshRates();
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"Hoper",777,0,Red); // продажа без стопов (WHC гад)
if(ticket<0){Print(ErrorDescription(GetLastError()));} // запись ошибки в лог
Sleep(1000); // спать на пол секунды
}
if(iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)<20 && iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0)<20 && iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)>iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0) && iOsMA(NULL,0,12,26,9,PRICE_CLOSE,0)<-0.00012)
{
GetLastError();
RefreshRates();
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"Hoper",777,0,Green);
if(ticket<0){Print(ErrorDescription(GetLastError()));}
Sleep(1000);
}
// Выход из рынка
if(OrdersTotal() > 0)
{
for(i = 0; i < OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol())
{
if(OrderType() == OP_SELL)
{
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+TrailingStop*Point,OrderOpenPrice()-TakeProfit*Point,0,Green);
continue;
}
if(OrdersTotal() > 0)
{
for(i = 0; i < OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol())
{
if(OrderType() == OP_BUY)
{
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-TrailingStop*Point,OrderOpenPrice()+TakeProfit*Point,0,Green);
continue;
return(0);
}
}
}
}
}
}
}
}
/////////////////////////////////////////////////////////Конец\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


 
         if(OrdersTotal()>0) // Эту строчку убрать... Смотрите внимательнее...
         if(OrderType()==OP_SELL)

В условии на открытие позиции пропишите сколько позиций вы допускаете...

щас у вас должно открываться немеренно.. пока депо хватит...

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

 

Hoper, - решайте ваши проблемы по мере их поступления! Сначала уберите к... модификацию и проверьте, открываются ли позиции так, как надо, с нулевыми стопами. Согласно вашим условиям.

Потом лучше всего, действительно, проще и надежнее вне ф-и INT START поставить ф-ю И.КИМА для реализации Market Watch и "будет вам счастье"...

И КОД своего эксперта выкладывайте пож. в соотв. виде используя 8 кнопку меню сообщения. Иначе мало кто будет даже смотреть ваш код, и тем более вникать в него.