[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 227

 
drknn:

Увеличьте проскальзывание (Slippage). Видать сделки открывались на быстром рынке. Оно иной раз после важных новостей бывает, что тот же евробакс так выстреливает за 1-2 тика, что просто кошмар. И пока сервер обрабатывает приказ советника цена меняется очень круто.


Опасаюсь что если Slippage будет большим всегда, то ДЦ может этим начать злоупотреблять на систематической основе. Хотелось бы "раздвигать" его динамически - только если цена на сервере оказалась лучше той по которой была послана заявка. По аналогии с выставлением заявки вручную - когда если запрашиваемой цены уже нет, то предлагается новая с которой можно согласиться нажав ОК или отвергнуть - если это канечно таже самая ситуация.

 

Всем здрасте! Помогите пожалуйста объединить следующие вещи. В итоге должно получиться: две линии следующие за ценой одна ниже Ask на 20п.,

другая-выше, а так же подается звуковой сигнал при изменении цены на 20п. за 1 тик.

По отдельности все работает шикарно, а соединить воедино не могу. Заранее спасибо!

1) Линия ниже Ask на 20п.

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask-20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask-20*Point);
return(0);
}

//+------------------------------------------------------------------+

2) Линия выше Ask на 20п.

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask+20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask+20*Point);
return(0);
}

//+------------------------------------------------------------------+

3) Скорость изменения цены во времени.

#property show_inputs

extern int pips=2; //изменение аск
extern double Time_=0.1; //c. ~ tick
extern bool все_из_обзора_рынка=true; // только текущий символ - false

int i, l, p, количество_символов;
string val[], на_экран;
int Ask_save[];

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void start(){
количество_символов=SymbolsList(val, true);//запись в массив val инструменты и их количество вызов функции SymbolsList
ArrayResize(Ask_save,количество_символов);
if(количество_символов == -1){ Alert("Ошибка открытия файла в SymbolsList(string &Symbols[], bool Selected)"); return;}
if(!все_из_обзора_рынка){
количество_символов=1;
ArrayResize(Ask_save,количество_символов);
ArrayResize(val,количество_символов);
val[0]=Symbol();
}

while(true&&!IsStopped()){ //если разрешить и не отанавливать скрипт продолжим

Alert("пересчитаем через "+Time_+" сек.");

for(i=0;i<количество_символов;i++){//посчитаем стоимость спреда для инструментов из обзора рынка
if((Ask_save[i]-MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT))>=pips){
Alert(val[i]+","+Period()+" изменился вниз на "+DoubleToStr((Ask_save[i]-MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)),0)+" pips");
PlaySound("timeout.wav");
}
if((MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)-Ask_save[i])>=pips){
Alert(val[i]+","+Period()+" изменился вверх на "+DoubleToStr((MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)-Ask_save[i]),0)+" pips");
PlaySound("email.wav");
}
Ask_save[i]=MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT);
}
Sleep(Time_*1000);//пауза сек.
}

/*
количество_символов=SymbolsList(val, true);//запись в массив val инструменты и их количество вызов функции SymbolsList
if(количество_символов == -1){ Alert("Ошибка открытия файла в SymbolsList(string &Symbols[], bool Selected)"); return;}

while(true&&!IsStopped()){ //если разрешить и не отанавливать скрипт продолжим
на_экран="\r\n"; //отступ
for(i=0;i<количество_символов;i++)//посчитаем стоимость спреда для инструментов из обзора рынка
на_экран=на_экран+val[i]+" стоимость спреда = " + DoubleToStr(MarketInfo(val[i],MODE_SPREAD)*MarketInfo(val[i],MODE_TICKVALUE),0)+"\r\n";
Comment(на_экран);//выведем на экран
Alert("Пересчитаем");//сигнал
Sleep(3000);//пауза 3 сек.
}
*/
}
void deinit(){Comment("");}
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=


//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// функция читает из обзора рынка все фин.инстр.
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
int SymbolsList(string &Symbols[], bool Selected){
int Offset, SymbolsNumber; string SymbolsFileName;
if(Selected) SymbolsFileName = "symbols.sel"; else SymbolsFileName = "symbols.raw";
int hFile = FileOpenHistory(SymbolsFileName, FILE_BIN|FILE_READ);
if(hFile < 0) return(-1); if(Selected) { SymbolsNumber = (FileSize(hFile) - 4) / 128; Offset = 116; }
else { SymbolsNumber = FileSize(hFile) / 1936; Offset = 1924; }
ArrayResize(Symbols, SymbolsNumber);
if(Selected) FileSeek(hFile, 4, SEEK_SET);
for(int i = 0; i < SymbolsNumber; i++){Symbols[i] = FileReadString(hFile, 12); FileSeek(hFile, Offset, SEEK_CUR);}
FileClose(hFile);
return(SymbolsNumber);
}
 
Vovo4ka:

Типо, умный петросян хочет пршутить..))

Сильно извиняюсь за вышесказанное, деньги ж Ваши. Чем больше вас, тем лучше нам.
 
ScioMe:

Как раз в MetaEditor есть стандартный индикатор iMA. Пользуйтесь на здоровье :)
Подскажите пожалуйста, где его конкретно взять и куда положить, я пока совсем чайник...
 
Vovo4ka:
Народ! Пытаюсь сделать,что бы торговал лотом в завимилости от риска....ну что невыходит....пишет

подскажите где ошибка....

У вас в истории торгов всего один ордер нужного типа?

if(OrderProfit()>0) break;

Если встретился ордер, закрытый в плюсе - вываливаемся из цикла и не проверяем остальную историю...

int    orders=HistoryTotal();     // history orders total

Это у вас своя функция? Или OrdersHistoryTotal() ???

Как-то смущает поиск количества убыточных ордеров. Если нужен последний закрытый, то где проверка что он последний?

Вот вам домашнее задание для самостоятельного разбора:

int losses=0;
for (int i=0; i<OrdersHistoryTotal(); i++) {                // Цикл по истории терминала
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {         // Если ордер выбран ...
      if (OrderSymbol()!=Symbol())     continue;            // Если символ ордера не наш -  к следующему ордеру
      if (OrderType()>OP_SELL)         continue;            // Если тип ордера не наш -     к следующему ордеру
      if (OrderMagicNumber()!=Magic)   continue;            // Если магик ордера не наш -   к следующему ордеру
      if (OrderProfit()>=0)            continue;            // Если профит ордера в плюсе - к следующему ордеру
      if (OrderProfit()<0)                                  // Ордер закрыт в минусе ...
         losses++;                                          // Увеличиваем счётчик убыточных ордеров      
      }
   else if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {   // Если не удалось выбрать ордер ...
      Print("Error in history! ", GetLastError());          // Сообщим об ошибке и посмотрим её код
      break;                                                // Прерываем цикл перебора ордеров
      }
   }

И вот ещё что:

if(ldlot<0.1) ldlot=0.1;

Может всё-таки лучше сделать проверку на меньше минимально-допустимого?

double MinLot=MarketInfo(Symbol(),MODE_MINLOT);
if (ldlot<MinLot) ldlot=MinLot;

А заодно и на больше максимального (при передаче размера лота в функцию)?

double MaxLot=MarketInfo(Symbol(),MODE_MAXLOT);
if (ldlot>MaxLot) ldlot=MaxLot;
 
doon:

Спасибо, но там все равно придется слип вставлять.

Не понял, а зачем он там нужен? Мне кажется там все просто.
 
ZZZEROXXX:


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

Если ДЦ начло злоупотреблять, то ни чего уже не поможет. Тут вот ещё что может сработать. Если в Вашем ДЦ спреды плавающие, то лучше в функцию старт советника сунуть автоопределение размера спреда и проскальзывание ставить, например в три спреда. Тогда проскальзывание станет динамически меняющимся.
 
Скажите, если работать с ордерами по тикету, как правильно написать переменную (int Ticket), как статик локальную или как обычную глобальную или вообще, как обычную локальную? Чет я запутался. Спасибо.
 
Fam:
Скажите, если работать с ордерами по тикету, как правильно написать переменную (int Ticket), как статик локальную или как обычную глобальную или вообще, как обычную локальную? Чет я запутался. Спасибо.

Всё зависит от того, будет ли данная переменная доступна всем функциям советника (ну... не всем, но некоторым - точно). Тогда - глобальная.

Ежели используется только в одной функции - тогда локальная.

Вопрос из разряда "в какую воду цветы поставить, в простую или подслащенную" ... пока гадали, цветы веником стали, в баню... :))

 
ZZZEROXXX:


Опасаюсь что если Slippage будет большим всегда, то ДЦ может этим начать злоупотреблять на систематической основе. Хотелось бы "раздвигать" его динамически - только если цена на сервере оказалась лучше той по которой была послана заявка. По аналогии с выставлением заявки вручную - когда если запрашиваемой цены уже нет, то предлагается новая с которой можно согласиться нажав ОК или отвергнуть - если это канечно таже самая ситуация.

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