Лента последних комментариев


0
Лучше язвить, чем язву иметь. Метаквотовцам передавайте наше с кистью.

Меня всегда интересуют причинно-следственные связи.

Простой советник от того и простой. Жаловаться на него, то же, что и на отсутствие зонта во время дождя. Т.е. бесполезно. Человек с колена поделился мыслью. Не нравится — проходи мимо. А если он тебе в жилу, разберись сам, чего понедельник тяжелый день. У меня тоже, как правило.

К стати не смотрел, но уверен: там орднра открываются не таким образом.

А подобных функций валом. Почти один в один. Так как программист я еще тот, то в кодомарании я больше доверяю Хлыстову, чем себе. Так мне жизненный опыт шепчет.

Тут у нас девушка обитает. Почему-то мама OXY назвала. Так вот, ее коды гораздо симпатичнее и продуманнее, чем коды АМ2. Так она тоже не брезгует подобными подходами. Сейчас что-нибудь найду.

Блин. В моем бардаке сходу хрен что найдешь. Попался Хлыстов первым, вот его и взял.
Не важно. Взял пример. Работаю над ним. Кто-то предложит другой вариант (может гораздро лучше) поработаем и с ним. А пока что конкурентции ноль.

Всех благ.

avatar

kvashnin007

  • 23 января 2025, 19:21
0
Так с чего ему таким лотом открывать? Пред идущий 3.4 а коэф 1.9 то лот должен быть 6.46
avatar

vladimir31

  • 23 января 2025, 17:38
0
not enough money — не достаточно средств для открытия ордера лотом 58.88
avatar

verta81

  • 23 января 2025, 17:36
0
Функция while


Опять метаквотовцы учебник переписали: раньше while был оператром, а теперь стал функцией.Вечно я за ними не успеваю.

Лучше не пользуйтесь функциями Хлыстова.На советник «простой советник» много жалоб в интернете было.Даже у меня к совеве питензии были: советник торгует хорошо первую неделю, а во вторую перестаёт открывать сделки, переустанавливаешь советник и вновь начинает открывать сделки и так до следующей недели
avatar

alex30774

  • 23 января 2025, 17:29
0



На демо поставил V3.1 что то ему не нравится ругается и лотаж путает. Поставьте у себя на демо, посмотрите если можно. Может что я не так делаю?
avatar

vladimir31

  • 23 января 2025, 17:12
0
Не факт, что брокера можно заставить таки открыть ордер, но чем настойчивее это действие, тем больше шансов.
По-этому можно еще больше обнаглеть. Завернуть одну просьбу в другую. Да, немного помедленнее. Но более убедительно.
А если учесть, что тестер при оптимизации, если нет ошибок, то с первого захода открывает сделки,
то те же 5-100 сделок в месяц ну никак не повлияют скорость работы советника.

Обратимся все к тому же Володе Хлыстову. Есть у него в свободном пользовании скрипт для открытия ордеров:

<code>#property copyright "Copyright © 2014, Хлыстов Владимир"
#property link      "cmillion@narod.ru"
#property show_inputs
#property strict
//--------------------------------------------------------------------
extern int      stoploss       = 50,       //уровень выставления SL, если 0, то SL не выставляется
                takeprofit     = 50,       //уровень выставления TP, если 0, то TP не выставляется
                MaxOrders      = 1,        //кол-во ордеров
                Magic          = 123456;   //уникальный номер ордера
extern double   LotBuy         = 0.1;      //объем ордера если 0 то не откоывать
extern double   LotSell        = 0.1;      //объем ордера если 0 то не откоывать
extern int      attempts       = 10;       //кол-во попыток открытия
extern int      Slippage       = 3;        //кол-во попыток открытия

string txt;
int n,slippage;
double STOPLEVEL;
//--------------------------------------------------------------------
int start()
{
      STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
      
      slippage = Slippage;
      
      if (Digits==3 || Digits==5) 
         slippage=Slippage*10;
   
      for (int i=1; i<=MaxOrders; i++)
         {
         if (LotBuy>0)
            OPENORDER (OP_BUY,NormalizeDouble(Ask,Digits),LotBuy,i);
         if (LotSell>0)
            OPENORDER (OP_SELL,NormalizeDouble(Bid,Digits),LotSell,i);
         }
      Comment("Скрипт закончил свою работу, выставлено ",n," ордеров  ");
   return(0);
}
//--------------------------------------------------------------------
void OPENORDER(int ord,double Price,double LOT,int i)
{
      int error,err=0;
      double SL=0,TP=0;
      
      while (true)
         {  
         error=true;
         RefreshRates();
         
         if (ord==OP_BUY) 
            {
            if (takeprofit>=STOPLEVEL) TP  = NormalizeDouble(Price + takeprofit*Point,Digits); else TP=0;
            if (stoploss>=STOPLEVEL)   SL  = NormalizeDouble(Price - stoploss*Point,Digits);   else SL=0;     
            error=OrderSend(Symbol(),OP_BUY, LOT,Price,slippage,SL,TP,"http://cmillion.ru",Magic,0,Blue);
            }
         if (ord==OP_SELL) 
            {
            if (takeprofit>=STOPLEVEL) TP = NormalizeDouble(Price - takeprofit*Point,Digits); else TP=0;
            if (stoploss>=STOPLEVEL)   SL = NormalizeDouble(Price + stoploss*Point,Digits);   else SL=0;              
            error=OrderSend(Symbol(),OP_SELL,LOT,Price,slippage,SL,TP,"http://cmillion.ru",Magic,0,Red);
            }
         if (error==-1)
            {  
            txt=StringConcatenate(txt,"\nError ",GetLastError());
            if (ord== 1) txt = StringConcatenate(txt,"  OPENORDER BUY ",i,"   Ask =",DoubleToStr(Ask,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Price-Ask)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
            if (ord==-1) txt = StringConcatenate(txt,"  OPENORDER SELL ",i,"   Bid =",DoubleToStr(Bid,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Bid-Price)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
            Print(txt);
            Comment(txt,"  ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
            err++;Sleep(1000);RefreshRates();
            }
         else 
            {
            Comment("Ордер ",error," успешно выставлен ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
            n++;
            return;
            }
         if (err >attempts)
             return;
         }
   return;
}                  
//--------------------------------------------------------------------
</code>


Здесь у него Цикл в цикле. Циклы, если обращаются за данными к брокеру, тормоза. Основные. Но в данном случае — вещь полезная и не ручник.

Правда у него здесь основной цикл пытается запустить программу открытия ордеров столько раз, сколько указываем в
MaxOrders. По идее: сколько ордеров укажешь, столько и откроет. Но все они одинаковые. В чем смысл? Не понятненько.
При этих настройках скрипт откроет один ордер на покупку по цене Ask и один ордер на продажу по цене Bid.
Ну да ладно. Это его скрипт и для его целей. Наша задача извлечь свою выгоду.

Но это в следующий раз
.

avatar

kvashnin007

  • 23 января 2025, 16:19
0
Продолжаем.

Хочу предложить к рассмотрению функцию, предложенную Владимиром Хлыстовым (cmillion).Она с болшей вероятностью открывает ордера. Можно потом добавить и отложки. Но это потом.

<code>//--------------------------------------------------------------------
void OPENORDER(int ord,double Price,double LOT)
{
      int rez,err=0;
      double SL=0,TP=0;
      
      while (true)
         {  
         rez=true;
         RefreshRates();
         
         if (ord==OP_BUY) 
            {
            if (takeprofit>=STOPLEVEL) TP  = NormalizeDouble(Price + takeprofit*Point,Digits); else TP=0;
            if (stoploss>=STOPLEVEL)   SL  = NormalizeDouble(Price - stoploss*Point,Digits);   else SL=0;     
            rez=OrderSend(Symbol(),OP_BUY, LOT,Price,slippage,SL,TP,"http://cmillion.ru",Magic,0,Blue);
            }
         if (ord==OP_SELL) 
            {
            if (takeprofit>=STOPLEVEL) TP = NormalizeDouble(Price - takeprofit*Point,Digits); else TP=0;
            if (stoploss>=STOPLEVEL)   SL = NormalizeDouble(Price + stoploss*Point,Digits);   else SL=0;              
            rez=OrderSend(Symbol(),OP_SELL,LOT,Price,slippage,SL,TP,"http://cmillion.ru",Magic,0,Red);
            }
         if (rez==-1)
            {  
            txt=StringConcatenate(txt,"\nError ",GetLastError());
            if (ord== 1) txt = StringConcatenate(txt,"  OPENORDER BUY ","  Ask =",DoubleToStr(Ask,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Price-Ask)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
            if (ord==-1) txt = StringConcatenate(txt,"  OPENORDER SELL ","  Bid =",DoubleToStr(Bid,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Bid-Price)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
            Print(txt);
            err++;Sleep(1000);RefreshRates();
            }
         else 
            {
            Comment("Ордер ",rez," успешно выставлен ");
            return;
            }
         if (err >attempts)
             return;
         }
   return;
}                  
//--------------------------------------------------------------------

</code>


А пока, что мы видим?

Функция while (true) Будет пытаться attempts раз выставить ордер. Вы можете сами указать сколько это раз. Если не сможет, то вообще выйдет из OPENORDER().

Но это уже к психотерапевту.

Перед походом, на всякий случай, проверте валидность выдаваемого лота. Журнал вам в помощь. А вообще-то, проверять надо всегда.

SL и ТР здесь сразу выставляются. Что не совсем комильфо. Думаю лучше обнулить. А выставление ограничений можно сделать отдельной функцией. Тоже настойчиво.

Это потом, а пока, думаю, функция должна выглядеть примерно так.

<code>//--------------------------------------------------------------------
void OPENORDER_2(int ord,double Price,double LOT)
{
      int rez,err=0;
      double SL=0,TP=0;
      
      while (true)
         {  
         rez=true;
         RefreshRates();
         
         if (ord==OP_BUY) 
            rez=OrderSend(Symbol(),OP_BUY, LOT,Price,slippage,0,0,"",Magic,0,Blue);
         if (ord==OP_SELL) 
            rez=OrderSend(Symbol(),OP_SELL,LOT,Price,slippage,0,0,"",Magic,0,Red);
         if (rez==-1)
            {  
            txt=StringConcatenate(txt,"\nError ",GetLastError());
            if (ord== 1) 
               txt = StringConcatenate(txt,"  OPENORDER BUY ","  Ask =",DoubleToStr(Ask,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Price-Ask)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((Price-SL)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((TP-Price)/Point,0),")  STOPLEVEL=",STOPLEVEL);
            if (ord==-1) 
               txt = StringConcatenate(txt,"  OPENORDER SELL ","  Bid =",DoubleToStr(Bid,Digits),"   Price =",DoubleToStr(Price,Digits)," (",NormalizeDouble((Bid-Price)/Point,0),")  SL =",DoubleToStr(SL,Digits)," (",NormalizeDouble((SL-Price)/Point,0),")  TP=",DoubleToStr(TP,Digits)," (",NormalizeDouble((Price-TP)/Point,0),")  STOPLEVEL=",STOPLEVEL);
            Print(txt);
            err++;
            Sleep(1000);
            RefreshRates();
            }
         else 
            {
            Comment("Ордер ",rez," успешно выставлен ");
            return;
            }
         if (err >attempts)
             return;
         }
   return;
}                  
//--------------------------------------------------------------------

</code>


Ограничения, если нужны выставим другой функцией.
avatar

kvashnin007

  • 23 января 2025, 14:56
0
Возможно интегрировать эту таблицу
Это таблица находится в папке с индикаторами?
Мне нужно когда приходит сигнал он смотрит цифру если она 9 то он ставит ордер и так же в любую сторону


это все в разы дороже будет чем так я предлагал. я лично не возьмусь
avatar

AM2

  • 23 января 2025, 11:12
0
Здравствуйте. Да, давайте как новый сделаем. Если в тот добавлять, сильно много будет накручено.
avatar

vladimir31

  • 23 января 2025, 08:24
0
Добрый день. 1000 р.
Новый сов?
avatar

verta81

  • 22 января 2025, 19:25
0
Новую версию делаем
avatar

vladimir31

  • 22 января 2025, 17:54
0

Возможно интегрировать эту таблицу
Это таблица находится в папке с индикаторами?
Мне нужно когда приходит сигнал он смотрит цифру если она 9 то он ставит ордер и так же в любую сторону
avatar

Denis2134

  • 22 января 2025, 13:18
0
Наверно можно и так. Но у меня есть советник, который лучше всего работает на дневках. А за три месяца делает до семиста сделок. Есть советники, которые привязываются именно к TF. Видимо поэтому мне никогда в голову не приходил такой способ.

Но, как говорил выше, каждому свое.
avatar

kvashnin007

  • 21 января 2025, 19:48
+1
Глупо спрашивать: как просчитать это количество.

1.Запускаете тестирование,
2.потом ставите на паузу
3.ставите вертикальную линию
4.затем снимаете с паузы и через минуту ставите вторую вертикальную линию
5.теперь считаете количество баров между вертикальными линиями

Если за минуту будет меньше 25 баров(такое бывает при использовании некоторых пользовательских индикаторов)советник может пропустить сделку, если тоговать на таймфреймах 1М,5М
avatar

alex30774

  • 21 января 2025, 19:26
0
И да. Вы правы. Скорость для меня имеет значение. Особенно в тестировании. Здесь тоже есть варианты. Например работать по ценам закрытия минутных свечей.

Но это должно быть продолжением топика.
avatar

kvashnin007

  • 21 января 2025, 19:13
0
Глупо спрашивать: как просчитать это количество.

Но согласен, что каждому свое. А на счет пропуска сделок — для этого и топик.
Расчитывал на похожих на вас, пробовавших всякое и имеющих результаты. Вот бы общаком и вывели максимально оптимальное.

У меня есть своих пара мыслей, как заставить брокера открыть, выставить, поставить и пр. Но прежде надо быть уверенным, что ты не нарушаешь никакие правила. Топик и об этом.
avatar

kvashnin007

  • 21 января 2025, 19:06
0
Скорость работы советника для меня не важна.Это я вам по советовал, так как мне показалось, что для вас она имеет значение.
Для меня на первом месте адекватность работы советника, чтобы советник не пропускал сигналы и всегда входил в сделки.
К сожалению функции отвечающим моим требованиям в свободном доступе нет.Я у многих програмистов проверил.Брал ихние советники и прописывал для всех одинаковые условия.И у всех были пропущенные сделки.
В маркете в котигории бесплатные попадались хорошие советники, под них как раз и подгонял советники с открытым кодом.Но у этих авторов не было советников с открытым кодом.

А вы, чтоб быть объективным, а не голословным, замените в советнике Moving Average код открытия ордера на функцию PutOrder и сравните скорости. Ну если, конечно, умеете. В противном случае — ко мне в топик. Вопросы только обогащают общение.

У каждого своё понимание о скорости.У меня количество баров за минуту.Тоесть сколько советник пройдёт баров за минуту в режиме тестирования.Но я на это внимание не особо обращаю.
avatar

alex30774

  • 21 января 2025, 18:37
0
Алекс, доброго дня, вечера, жизни.

Рад, что хоть кто-то…

Поэтому отвечу на вопрос.

Начну с названия топика: Функции…
Их много. Думаю, что прибегали хоть раз к услугам АМ2. Если так, то вы видели его вариант PutOrder(). Ну вот вы родили толкову мысль, с помощью Андрея получили советник для тестера, потестировали, чуть поправили алгоритм и… Сами охренели.

Как красиво пишет зараза. Куплю жене сапоги. Положили на счет котлету и на всю начали зарабатывать, зеленея от надежды. А что-то идет не по феншую. Вы его и так и сяк. А он все херет и хренет. Не понятненько… "- Андрей, а чего так-то?" Так советник то для тестера. Под реал адаптировать надо. Пару копеек и любой каприз.
А уверенность в работоспособности поубавилась до нуля. Зачем тратить деньги? Так вот и пропадают хорошие идеи.

А если бы вы позанимались в моем топике, то сами бы привели советник в реальное состояние. Погоняли бы его в этом измененном состоянии, а затем бы делали оргвыводы. Если бы вы получили приемлемые результаты, то и с деньгами бы расставались бы осознанно.

Это так. Лирика о смысле топика.

Теперь по существу.

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

Что значит работает в тестере? Вы наверно имели ввиду процес оптимизации. У меня есть советник, который тормозит оптимизацию практически до нуля, а на демо работает без задержек.Ибо такие задержки на реальную торговлю не влияют.
Я вас уверяю, что вы в теле советника сорок раз пропишете один и тот же код, что сорок раз обратитесь к внешней функции, на скорость работы советника это практически не повлияет.
А так строк меньше, что в карму, и читаемость улучшается, что в карму для пытливых.

А советники я изучаю чисто по коду. Там все написано. В отличие от тестера.

А вы, чтоб быть объективным, а не голословным, замените в советнике Moving Average код открытия ордера на функцию PutOrder и сравните скорости. Ну если, конечно, умеете. В противном случае — ко мне в топик. Вопросы только обогащают общение.
avatar

kvashnin007

  • 21 января 2025, 17:42