//+------------------------------------------------------------------+ #property copyright "" #property link "" #property version "1.00" //+------------------------------------------------------------------+ input double Risk =1; // // input double Exponenta =1.3; input double TPproc =0.2; input int Step =5; input int n =100; input int Magic =2017; //+------------------------------------------------------------------+ string comment ="System"; int r, D; datetime NewBar =0; double NewLot; //+------------------------------------------------------------------+ int OnInit(){ D=1; if (Digits==5 || Digits==3)D=10; return(INIT_SUCCEEDED);} //+------------------------------------------------------------------+ void OnDeinit(const int reason){} //+------------------------------------------------------------------+ void OnTick(){ //+------------------------------------------------------------------+ double Lot=0; Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2); if (Lot<MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT); //+------------------------------------------------------------------+ if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01) int dig =2; if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.10) dig =1; if(MarketInfo(Symbol(),MODE_LOTSTEP)==1.00) dig =0; //+------------------------------------------------------------------+ if(NewBar!= iTime(Symbol(),0,0) ) {NewBar = iTime(Symbol(),0,0) ; //+------------------------------------------------------------------+ bool Sell=false; bool Buy=false; if(Open[n+1]<Close[n+1] && Open[n]<Close[n]) {Buy=true;} if(Open[n+1]>Close[n+1] && Open[n]>Close[n]) {Sell=true;} //+------------------------------------------------------------------+ bool minus=false, plus=false; if(LastProfit()<0) {minus=true;} if(LastProfit()>=0) {plus=true;} //+------------------------------------------------------------------+ if(plus || CountH(-1)==0) {NewLot=Lot;} if(minus && CountH(-1)>0) {NewLot=NormalizeDouble(LastLot()*Exponenta, dig);} //+------------------------------------------------------------------+ double P_Max=(AccountBalance()/100)*TPproc; if(Count(OP_SELL)==0 && Sell && LastType()!=OP_SELL && (Profit(OP_BUY)>P_Max*Count(OP_BUY) || CountH(-1)==0)) {r=OrderSend(Symbol(),OP_SELL,NewLot,Bid,10,0,0,comment,Magic,0,Red); CloseBuy();} if(Count(OP_BUY)==0 && Buy && LastType()!=OP_BUY && (Profit(OP_SELL)>P_Max*Count(OP_SELL) || CountH(-1)==0)) {r=OrderSend(Symbol(),OP_BUY,NewLot,Ask,10,0,0,comment,Magic,0,Green); CloseSell();} //+------------------------------------------------------------------+ if(Count(OP_BUY)>0 && Ask+Step*D*Point<=BuyPric()) {r=OrderSend(Symbol(),OP_BUY,NewLot,Ask,10,0,0,comment,Magic,0,Green);} if(Count(OP_SELL)>0 && Bid-Step*D*Point>=SellPric()) {r=OrderSend(Symbol(),OP_SELL,NewLot,Bid,10,0,0,comment,Magic,0,Red);} //+------------------------------------------------------------------+ }} //+------------------------------------------------------------------+ //| Считаем количество ордеров по типу | //+------------------------------------------------------------------+ int Count(int type) {int count=0; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {if(Symbol()==OrderSymbol() && Magic==OrderMagicNumber() && (type==-1 || OrderType()==type)) count++;} return(count);} //+------------------------------------------------------------------+ //| Функция закрытия ордеров | //+------------------------------------------------------------------+ void CloseBuy() {double priceB; for(int i=OrdersTotal()-1;i>=0;i--) {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {if(Symbol()==OrderSymbol() && OrderType()==OP_BUY && Magic==OrderMagicNumber()) {priceB=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID), Digits); bool clos=OrderClose(OrderTicket(),OrderLots(),priceB,100,0);}}} return;} //+------------------------------------------------------------------+ void CloseSell() {double priceS; for(int i=OrdersTotal()-1;i>=0;i--) {if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {if(Symbol()==OrderSymbol() && OrderType()==OP_SELL && Magic==OrderMagicNumber()) {priceS=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK), Digits); bool clos=OrderClose(OrderTicket(),OrderLots(),priceS,100,0);}}} return;} //+------------------------------------------------------------------+ //| Определяем тип последнего ордера | //+------------------------------------------------------------------+ int LastType() {int type=-1; datetime dt=0; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {if(Symbol()==OrderSymbol() && OrderMagicNumber()==Magic) {if(OrderOpenTime()>dt) {dt=OrderOpenTime(); type=OrderType();}}} return(type);} //+------------------------------------------------------------------+ //| Определяем лот последнего ордера | //+------------------------------------------------------------------+ double LastLot() {int type=-1; double lots; datetime dt=0; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {if(Symbol()==OrderSymbol() && OrderMagicNumber()==Magic) {if(OrderOpenTime()>dt) {dt=OrderOpenTime(); type=OrderType(); lots=OrderLots();}}} return(lots);} //+------------------------------------------------------------------+ //| Определяем профит последнего ордера | //+------------------------------------------------------------------+ double LastProfit() {int type=-1; double profit; datetime dt=0; for(int i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {if(Symbol()==OrderSymbol() && OrderMagicNumber()==Magic) {if(OrderOpenTime()>dt) {dt=OrderOpenTime(); type=OrderType(); profit=OrderProfit();}}} return(profit);} //+------------------------------------------------------------------+ //| Определяем цену последнего ордера бай | //+------------------------------------------------------------------+ double BuyPric() { double oldorderopenprice; int oldticketnumber; double unused = 0; int ticketnumber = 0; for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { bool clos=OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue; if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) { oldticketnumber = OrderTicket(); if (oldticketnumber > ticketnumber) { oldorderopenprice = OrderOpenPrice(); unused = oldorderopenprice; ticketnumber = oldticketnumber;}}} return (oldorderopenprice);} //+------------------------------------------------------------------+ //| Определяем цену последнего ордера селл | //+------------------------------------------------------------------+ double SellPric() { double oldorderopenprice; int oldticketnumber; double unused = 0; int ticketnumber = 0; for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { bool clos=OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue; if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) { oldticketnumber = OrderTicket(); if (oldticketnumber > ticketnumber) { oldorderopenprice = OrderOpenPrice(); unused = oldorderopenprice; ticketnumber = oldticketnumber;}}} return (oldorderopenprice);} //+------------------------------------------------------------------+ int CountH(int type) {int count=0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {if(Symbol()==OrderSymbol() && Magic==OrderMagicNumber() && (type==-1 || OrderType()==type)) count++;} return(count);} //--------------------------------------------------------------------+ double Profit(int type) {double Profit = 0; for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {if (Symbol()==OrderSymbol() && OrderMagicNumber()==Magic && (OrderType() == type || type==-1)) Profit += OrderProfit()+OrderSwap()+OrderCommission();}} return (Profit);}
Как не торговать, но зарабатывать на трейдинге?
Создавать торговых роботов!
17 октября у главного алготрейдера компании Сергея Усанова стартует сразу два курса по разработке торговых роботов:
— на C#
— на LUA
— Курс «Разработка торговых роботов на С#» — это полноценное обучение программированию с нуля. 4 месяца. С нуля и для опытных.
В течение этого времени Сергей будет обучать вас азам алготрейдинга с базы до готового продукта. В течение курса вы самостоятельно напишете 5 торговых роботов с разными алгоритмами.
— Курс «Разработка торговых роботов на LUA» — 2 месяца обучения от введения в алгоритмическую торговлю до тестирования написанных на курсе роботов.
5 октября в 19:00 главный алготрейдер компании Сергей Усанов проведет открытый вебинар «Как создавать торговых роботов для криптобирж и Московской биржи».
Вебинар будет интересен не только программистам, но и трейдерам, которые хотят самостоятельность писать и тестировать в своей торговле роботов.
Приходите на вебинар и узнайте больше о торговых роботов от профессионала алготрейдинга — Сергея Усанова.
На вебинаре Сергей расскажет вам про:
Алгоритмическая торговля — один из видов трейдинга, который привлекает огромное количество людей с техническим образованием. Я вместе с другом в 2017-2018 году увлекался написанием собственных роботов, работающих на принципах технического анализа (ТА). Мы проверили многие известные стратегии и индикаторы, и я могу ответственно заявить, что в своем подавляющем большинстве они не работают. По крайней мере в том виде, в котором изложены в популярных книгах по ТА.
Однако тройка роботов у нас все же трудилась, но конечный результат в боевой работе не стал существенно интереснее, чем мои портфельные инвестиции. «Обслуживание» же их отнимало немало времени, отвлекая от основной работы. Тогда я для себя сделал один основной вывод — если вы хотите заниматься роботизированной торговлей, то вам необходимо очень сильно вкладываться в программирование и оборудование, а главное в последующую поддержку. И сделать это руками одного человека или даже небольшой команды — дело крайне неперспективное и весьма затратное. А пока вы только начинаете и у вас не так много денег, то пройдет совсем немного времени, когда энтузиазм в вашей команде иссякнет.
Одной из икон алгоритмической торговли — является алгоритмический хедж-фонд Medallion, принадлежащий другой компании Renaissance Technologies. С момента своего создания в 1980-х и на протяжении 30 лет, он показывал доходность в невероятные 40% годовых (для сравнения инвестиции Баффета оцениваются как 20% годовых). Идеологом и основным менеджером фонда был Джеймс Харрис Саймонс. История успеха данного фонда остается в фокусе внимания до сих пор. Но так как это хедж-фонд, то многое что происходит внутри него остается за непроницаемой стеной молчания, и его секрета охраняются не чуть не хуже, чем гос-тайна. Это, конечно, порождает массу вопросов, на которых нет ответов, а кроме того заставляет многих скептически относится к его результатам, подозревая Саймонса в аферизме. В целом некоторые события вокруг Medallion — дают понять, что в реальности может быть не все так гладко и красиво. Например, в книге Скотта Паттерсона «Кванты» описан вот такой интересный случай:
Параноидальный страх Саймонса, что кто-то из сотрудников мог уйти из фонда и унести с собой рецепт его волшебного эликсира, был так велик, что он был готов сделать все, чтобы похоронить карьеру изменников. В декабре 2003 года Renaissance подал в суд на двоих сотрудников, Александра Белопольского и Павла Вольфбейна, которые перешли в гигантский нью-йорский хедж-фонд Millennium Partners. Двух бывших физиков из MIT обвинили в незаконном присвоении коммерческой тайны. Вольфбейн направил ответный иск против Renaissance, обвинив фонд в том, что ему как сотруднику приходилось разрабатывать методы «обмана инвесторов, пользующихся портфельной системой для институционально трейдинга или POSIT». Имелся в виду скрытый пул ликвидности — по сути электронный рынок, тайно оперирующий заказами на покупку и продажу акций. Вольфбейн сказал, что ему были выданы инструкции создать код, «открывающий информацию, которую POSIT должен был хранить как конфиденциальную», и что он в числе нескольких других коллег отказался участвовать в этой схеме, потому что это было противозаконно. В иске также упоминались сомнительные сделки по свопам, которые он, не вдаваясь в детали, охарактеризовал как «крупное мошенничество». Из этих взаимных обвинений так ничего и не вышло, и стороны в последствии заключили мирное соглашение.
Привет!
Совсем скоро буду запускать автоследование в Тинькофф. Рассказываю о своем предложении и стратегии здесь и здесь.
Пока мы дописываем код по API брокера, предлагаю любому пользователю Smart-Lab бесплатно потестировать мою стратегию. Для этого не обязательно быть клиентом Тинькофф брокера. Более того, вы можете даже сделки не делать, а просто следить за сделками алгоритма, смотреть как работают стопы чтобы понять для себя подходит вам такая стратегия или нет.
В начале следующей недели мы сделаем специальный чат, в который будут транслироваться сигналы алгоритма. Раз в час в этот чат будет приходить информация о текущей позиции алгоритма и необходимых действиях. Таймфрейм часовой, так что любой желающий может хоть с телефона успевать делать необходимые сделки. Чтобы узнать ссылку на будущий чат подпишитесь на канал, где будет опубликована ссылка или напишите мне
Скальпинг — изначально значит “скальпировать, снимать скальп”. Это сверхточный вход в сделку с риском в несколько пунктов (минимальным риском) и большим потенциалом, в разы превышающим риск. Данный стиль торговли часто путают с пипсовкой — супербыстрыми сделками, которые часто не достигают даже одной минуты. Но это не одно и то же.
Скальпер в течение дня совершает большое количество сделок, делая максимально точные входы и удерживая позицию столько, сколько этого требует поставленная цель, в зависимости от импульса и ситуации.
Что нужно знать про скальпинг?
Чем меньше вы находитесь в сделке, тем меньше вы рискуете. Это аксиома скальпинга. С другой стороны, чем меньше вы находитесь в сделке, тем меньше зарабатываете. Это обратная сторона скальпинга.
альперы спокойно спят ночью, потому что не оставляют позиции в рынке и не зависят от того, что будет на следующий день: начнется ли война, выйдут ли серьезные экономические новости и т.д.