torgf 0 Share Posted September 7, 2018 Как получить значения линий сетки Фибоначчи, натянутой по первым фракталам? В переменных LOWER, UPPER, значения фракталов. Quote Link to post Share on other sites
Ugar68 372 Share Posted September 8, 2018 18 часов назад, torgf сказал: Как получить значения линий сетки Фибоначчи, натянутой по первым фракталам? В переменных LOWER, UPPER, значения фракталов. Надо разместить объект https://docs.mql4.com/ru/objects/objectcreate Потом получить данные линий. https://docs.mql4.com/ru/objects/objectgetdouble Ну а если надо что бы без самого объекта, то считать уровни. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted September 12, 2018 (edited) Такая задачка: пометить на истории каждый верхний фрактал из трёх первых, отсчёт от N бара, если текущая цена равна цене фрактала и максимальная цена на отрезке от текущего бара до фрактала равного текущей цене, больше 100 пунктов. Подскажите, пожалуйста, как действовать. Edited September 12, 2018 by torgf Quote Link to post Share on other sites
Ugar68 372 Share Posted September 12, 2018 10 часов назад, torgf сказал: Такая задачка: пометить на истории каждый верхний фрактал из трёх первых, отсчёт от N бара, если текущая цена равна цене фрактала и максимальная цена на отрезке от текущего бара до фрактала равного текущей цене, больше 100 пунктов. Подскажите, пожалуйста, как действовать. Что бы не запутаться, лучше делать всё по очереди. 1. Перебирая бары в цикле от N искать 3 фрактала вызовом iFractals. Номера баров найденных загнать в массив. 2. Перебирая найденные фракталы в цикле искать тот что совпадает с текущей ценой. Если найден такой загнать его номер бара в переменную. 3. Найти бар с максимальной ценой от 0 до номера бара в переменной с помощью iHighest. 4. Посчитать разницу в цене от High найденного максимального бара до текущей цены. Можно конечно всё загнать в один цикл, но это может запутать. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted September 12, 2018 Спасибо. Скажите, пожалуйста, какая последовательность действий при реализации в одном цикле. Постараюсь не запутаться Quote Link to post Share on other sites
Ugar68 372 Share Posted September 13, 2018 17 часов назад, torgf сказал: Спасибо. Скажите, пожалуйста, какая последовательность действий при реализации в одном цикле. Постараюсь не запутаться Перебирая бары в цикле от текущего бара искать максимальную цену, начиная с N бара искать фрактал, вызывая iFractals, который совпадёт с текущей ценой. Если нашлось 3 фрактала, но ни один не подошёл - прервать цикл. Если нашёлся фрактал совпадающий с текущей ценой - поднять флаг найденного фрактала и прервать цикл. При этом максимальная цена уже найдена. Если после цикла флаг найденного фрактала поднят, посчитать разницу от найденного максимума до текущей цены. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted September 13, 2018 Спасибо. Вроде бы всё сделала по плану, только проверку до максимума поместила внутри цикла, иначе, не до всех трёх фракталов ищем максимум. Что неправильно? for(int i_i=i; i_i<limit; i_i++) { if(high_old<high[i_i]) high_old=high[i_i]; if(i_i>=_N)//начиная с N бара ищу фракталы { f=iFractals(Symbol(),0,MODE_UPPER,i_i); if(f>0)//Если фрактал найден { kfr_all++;//счётчик фракталов if(Low[i]<f && High[i]>f && //Сравнение фрактала с текуще ценой kfr_all<=3 //3 && high_old-f>=100*Point//от максимума до фрактала 100 пп ) { bingob=true; break; } if(kfr_all==3)break; } } } if(bingob) { BufferPointUp[i]=low[i]; bingob=false; } Quote Link to post Share on other sites
Ugar68 372 Share Posted September 14, 2018 По условию вроде не надо было искать максимум до всех трёх фракталов искать. Надо же было искать только до того который совпал с текущей ценой. Что для Вас текущая цена? if(Low[i]<f && High[i]>f && //Сравнение фрактала с текуще ценой Я считал что текущая цена это Bid. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted September 14, 2018 (edited) 17 часов назад, Ugar68 сказал: Я считал что текущая цена это Bid. Так в индикаторе при использовании Bid ничего на истории не строится, или это только у меня) Вообще, замысел такой- Номер бара, от которого ищу фракталы это бар первого фрактала сформированного выше МА. В основном цикле запоминаю его время в "time_n_vernif", поднимаю флаг чтобы первый фрактал выше МА оставался в переменной, потом _N=iBarShift(NULL,PERIOD_CURRENT,time_n_vernif,true)-i; и от _N ищу на трёх фракталах, включая первый фрактал сформированный выше МА, равенство текущей цене, то есть если текущий бар, в любое время был равен цене фрактала то заполнить буфер. Возможно, как всегда, усложняю) Подскажите если есть более простое решение. Edited September 14, 2018 by torgf Quote Link to post Share on other sites
Ugar68 372 Share Posted September 15, 2018 На текущем баре, текущая цена это Bid=close[0]. На истории текущей ценой могла быть любая от Low до High включительно. if(Low[i]<f+0.5*_Point && High[i]>f-0.5*_Point И я ещё не понял зачем запоминать время фрактала, а потом искать номер его бара. Почему бы сразу не запомнить номер бара фрактала? Хотя, возможно я не вижу картину целиком. Я обычно запоминаю время фрактала, только если нужно использовать его на другом тике, так как номер бара может измениться. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted September 15, 2018 7 часов назад, Ugar68 сказал: И я ещё не понял зачем запоминать время фрактала, а потом искать номер его бара. Почему бы сразу не запомнить номер бара фрактала? Хотя, возможно я не вижу картину целиком. Я обычно запоминаю время фрактала, только если нужно использовать его на другом тике, так как номер бара может измениться. Спасибо. Нет ли возможности в текущее время узнать на каком баре, от текущего, сформировался первый верхний фрактал выше МА. чтобы от него дальше в историю искать из трёх фракталов равный любой цене текущего бара и параллельно искать максимальную цену. Полная картина, так сказать, на рисунке. Текущая цена равна фракталу 2, фрактал 1- это первый фрактал выше МА Quote Link to post Share on other sites
Ugar68 372 Share Posted September 16, 2018 Всё то же самое, только добавляется МА. Перебирая бары в цикле от текущего бара искать максимальную цену, и первый фрактал, вызывая iFractals, и МА вызывая iMA. Как только фрактал выше МА, счётчик фракталов задать 1. Далее искать фракта арка не найдётся тот который совпадёт с текущей ценой. Если нашлось 3 фрактала, но ни один не подошёл - прервать цикл. Если нашёлся фрактал совпадающий с текущей ценой - поднять флаг найденного фрактала и прервать цикл. При этом максимальная цена уже найдена. Я не понял, на картинке у Вас есть ещё фрактал правее и он выше МА. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted September 16, 2018 (edited) 14 часов назад, Ugar68 сказал: ... на картинке у Вас есть ещё фрактал правее и он выше МА. Да, в этом и дело, относительно текущего бара это третий, он может быть и пятый и десятый фрактал, но он первый после того как цена перешла выше МА. Как, в текущее время узнать что он первый выше МА? И наверное, нужно сразу проверять расстояние до макс, а то один фрактал найдём равный цене, выйдем из цикла а от него до макс цены меньше 100, от остальных может было 100 пп ) Edited September 16, 2018 by torgf Quote Link to post Share on other sites
Ugar68 372 Share Posted September 17, 2018 Значит я не до конца понял. Тогда немного меняем начало, оно будет выглядеть так: Для начала надо точно определиться что такое текущая цена выше МА или ниже МА и описать это в условии. Перебирая бары в цикле от текущего бара искать максимальную цену, и первый фрактал, вызывая iFractals. Если нашёлся проверить выше ли текущая цена МА, если нет забыть этот фрактал искать дальше. Если выше то запомнить бар фрактала. Предварительно считать его нулевым. Далее искать фракталы и максимальную цену и проверять текущую цену относительно МА. Если нашёлся новый фрактал, но цена не стала ниже МА, забыть прошлый фрактал и считать нулевым новый найденный. Так же забыть найденный максимум. и искать снова фрактал и максимум проверяя цену относительно МА. Если цена стала ниже МА, значит найденный ранее нулевой фрактал считать первым... Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted September 17, 2018 (edited) 13 часов назад, Ugar68 сказал: Для начала надо точно определиться что такое текущая цена выше МА или ниже МА и описать это в условии. Понятно у меня не получается сформулировать Текущая цена относительно МА, не имеет значения. Важно что цена фрактала выше МА то есть предыдущий фрактал был ниже МА, позже сформировался фрактал выше МА, вот он и есть первый. 13 часов назад, Ugar68 сказал: Если цена стала ниже МА, значит найденный ранее нулевой фрактал считать первым.. Не понимаю. Счётчику присвоить 1, а как дальше считать? Изобразила, сначала цена равна второму из искомых фракталов, позже первому. Эти условия и пытаюсь зафиксировать. Edited September 17, 2018 by torgf Quote Link to post Share on other sites
Ugar68 372 Share Posted September 18, 2018 Перебирая бары в цикле от текущего бара искать максимальную цену, и первый фрактал, вызывая iFractals. Если нашёлся проверить выше ли фрактал МА, если нет забыть этот фрактал искать дальше. Если выше то запомнить бар фрактала. Предварительно считать его нулевым. Далее искать фракталы и максимальную цену и проверять фрактал относительно МА. Если нашёлся новый фрактал, но он не стал ниже МА, забыть прошлый фрактал и считать нулевым новый найденный. Так же забыть найденный максимум. и искать снова фрактал и максимум проверяя фрактал относительно МА. Если найден фрактал ниже МА, значит найденный ранее нулевой фрактал считать первым, а новый вторым. Проверить совпадает ли какой то из них с текущей ценой, если нет искать 3 фрактал... Я уже не помню что там было по поводу поиска максимума, и честно говоря, уже запутался. По этому, я сразу и писал что лучше задачу решать последовательно, а не всё сразу в одном цикле. Во всяком случае, поиск максимума лучше вынести из цикла, разве что если Вам надо несколько максимумов, тогда да, там ему и место. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted September 19, 2018 (edited) Спасибо, нашла . Можно, как нибудь, узнать первоначальный размер лота позиции закрытой по частям. Например лот 0.3 закрыт по рынку дважды 0.1 и 0.1, остаток закрылся по стоп лосс. Как узнать что был лот 0.3? Эта функция возвращает лот последней части позиции double GetLotLastClosePos(string sy="", int op=-1, int mn=-1) { datetime o; double l=-1; int i, k=OrdersHistoryTotal(); if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (o<OrderCloseTime()) { o=OrderCloseTime(); l=OrderLots(); } } } } } } } return(l); } Edited September 19, 2018 by torgf Quote Link to post Share on other sites
Ugar68 372 Share Posted September 19, 2018 При частичном закрытии на в МТ4 Альпари меняется тикет и комментарий. Можно проследить по истории цепочку закрываемых ордеров по тикетам и комментариям. Но это будет работать только у тех брокеров, которые выполняют частичное закрытие так же. Гораздо проще и универсальнее, если нужен начальный лот, запомнить его в GV или файле. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
torgf 0 Share Posted September 19, 2018 Спасибо, а нет ли примера закрытия позиции по частям в mql5. Quote Link to post Share on other sites
Ugar68 372 Share Posted September 19, 2018 Пятёрка менее популярна, и программы для неё заказывают реже. Мне пока не приходилось писать частичное закрытие позиций. Но думаю что оно мало отличается от полного закрытия, лот другой. Возможно AntFX поможет. Если он писал корректировщик объёмов для пятёрки, наверняка там частичное закрытие выполнял. 1 Quote Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
tyrbo924 168 Share Posted September 19, 2018 Здрасте всем! Ребят помогите. Данный советник почему то на центовом работать не хочет, должен закрывать накопленные сделки в одном месте и выставлять стопы. После появления пятого знака переделали работал на стандарте. На центе не работает. //+------------------------------------------------------------------+ //| франк_уд.mq4 | //+------------------------------------------------------------------+ #define m 20050612 //---- extern int tp = 37; extern int sh = 25; //---- datetime lastt; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int kol_buy() { int kol_ob = 0; //---- for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break; //---- if(OrderType() == OP_BUY) kol_ob++; } return(kol_ob); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int kol_sell() { int kol_os = 0; //---- for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break; //---- if(OrderType() == OP_SELL) kol_os++; } return(kol_os); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { int slip, i, ii, tic, total, kk, gle; double lotsi = 0.000; bool sob = false, sos = false, scb = false, scs = false; int kb, kb_max = 0; kb = kol_buy() + 1; double M_ob[11][8]; ArrayResize(M_ob,kb); int ks = 0, ks_max = 0; ks = kol_sell() + 1; double M_os[11][8]; ArrayResize(M_os,ks); ArrayInitialize(M_ob, 0.00); int kbi = 0; double Point_ = Point*10; //---- for(i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break; //---- if(OrderSymbol() == Symbol() && OrderType() == OP_BUY) { kbi++; M_ob[kbi][0] = OrderTicket(); M_ob[kbi][1] = OrderOpenPrice(); M_ob[kbi][2] = OrderLots(); M_ob[kbi][3] = OrderType(); M_ob[kbi][4] = OrderMagicNumber(); M_ob[kbi][5] = OrderStopLoss(); M_ob[kbi][6] = OrderTakeProfit(); M_ob[kbi][7] = OrderProfit(); } } M_ob[0][0] = kb; double max_lot_b = 0.000; //---- for(i = 1; i < kb; i++) if(M_ob[2] > max_lot_b) { max_lot_b = M_ob[2]; kb_max = i; } double buy_lev_min = M_ob[kb_max][1]; ArrayInitialize(M_os,0.00); int ksi = 0; //---- for(i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; //---- if(OrderSymbol()==Symbol() && OrderType()==OP_SELL) { ksi++; M_os[ksi][0] = OrderTicket(); M_os[ksi][1] = OrderOpenPrice(); M_os[ksi][2] = OrderLots(); M_os[ksi][3] = OrderType(); M_os[ksi][4] = OrderMagicNumber(); M_os[ksi][5] = OrderStopLoss(); M_os[ksi][6] = OrderTakeProfit(); M_os[ksi][7] = OrderProfit(); } } M_os[0][0] = ks; double max_lot_s = 0.000; //---- for(i = 1;i < ks; i++) if(M_os[2] > max_lot_s) { max_lot_s = M_os[2]; ks_max = i; } double sell_lev_max = M_os[ks_max][1]; //---- if(Bars < 100 || IsTradeAllowed() == false) return(0); sob = (kol_buy() < 1 || buy_lev_min - sh*Point_ > Ask) && AccountFreeMargin() > AccountBalance()*0.5; sos = (kol_sell() < 1 || sell_lev_max + sh*Point_ < Bid) && AccountFreeMargin() > AccountBalance()*0.5; //---- if(M_ob[kb_max][2] > 0.00) scb = M_ob[kb_max][7] / (M_ob[kb_max][2]*10) > tp; //---- if(M_os[ks_max][2] > 0.00) scs = M_os[ks_max][7] / (M_os[ks_max][2]*10) > tp; kk = 0; ii = 0; //---- if(scb) { while(kol_buy() > 0 && kk < 3) { for(i = 1; i <= kb; i++) { ii = M_ob[0]; //---- if(!OrderClose(ii,M_ob[2],Bid,slip,White)) { gle = GetLastError(); kk++; Print("Ошибка №", gle, " при close buy ", kk); Sleep(6000); RefreshRates(); } } kk++; } } kk = 0; ii = 0; //---- if(scs) { while(kol_sell() > 0 && kk < 3) { for(i = 1; i <= ks; i++) { ii = M_os[0]; //---- if(!OrderClose(ii,M_os[2], Ask, slip, White)) { gle = GetLastError(); kk++; Print("Ошибка №", gle, " при close sell ", kk); Sleep(6000); RefreshRates(); } } kk++; } } kk = 0; tic = -1; //---- if(sob) { if(max_lot_b == 0.00) lotsi = 0.01; else lotsi = 2.0*max_lot_b; //---- while(tic == -1 && kk < 3) { tic = OrderSend(Symbol(), OP_BUY, lotsi, Ask, slip, 0, Ask + (tp + 25)*Point_, " ", m, 0, Yellow); Print("tic_buy=", tic); //---- if(tic==-1) { gle = GetLastError(); kk++; Print("Ошибка №", gle, " при buy ", kk); Sleep(6000); RefreshRates(); } } lastt = CurTime(); return; } tic = -1; kk = 0; //---- if(sos) { if(max_lot_s == 0.00) lotsi = 0.01; else lotsi = 2.0*max_lot_s; //---- while(tic == -1 && kk < 3) { tic = OrderSend(Symbol(), OP_SELL, lotsi, Bid, slip, 0, Bid - (tp + 25)*Point_, " ", m, 0, Red); Print("tic_sell=", tic); //---- if(tic == -1) { gle = GetLastError(); kk++; Print("Ошибка №", gle, " при sell ", kk); Sleep(6000); RefreshRates(); } } lastt = CurTime(); return; } } //+------------------------------------------------------------------+ Quote Умничать и быть умным - разные понятия! Link to post Share on other sites
torgf 0 Share Posted September 24, 2018 (edited) В 19.09.2018 в 08:00, Ugar68 сказал: Понятно Помогите на mql5 найти номер бара закрытия последней позиции. .На mql4 так: int NumberOfBarCloseLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) { datetime t; int i, k=OrdersHistoryTotal(); if (sy=="" || sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol()==sy) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderCloseTime()) t=OrderCloseTime(); } } } } } } return(iBarShift(sy, tf, t, True)); } Edited September 24, 2018 by torgf Quote Link to post Share on other sites
AntFX 6,474 Share Posted September 24, 2018 (edited) 2 часа назад, torgf сказал: Помогите на mql5 найти номер бара закрытия последней позиции. На mql5 почти также, только нужно искать последнюю сделку со свойством "out", то есть выход из рынка (что то же самое, что закрытие позиции). void OnStart(){ int bar=LastDealCloseBarMT5(); if(bar>=0){ Print("Найдено время закрытия последней сделки: ", TimeToString(iTime(Symbol(), PERIOD_CURRENT, bar))," номер бара ", bar); }} int LastDealCloseBarMT5(string sy="", ENUM_TIMEFRAMES tf=PERIOD_CURRENT, int op=-1, int mn=-1){ HistorySelect(0, TimeCurrent()); // В МТ5 сначала нужно выбрать историю (от начала времен до текущего момента) datetime t=0; int i, k=HistoryDealsTotal(); // Всего сделок в истории ulong d=0; if(sy=="") sy=Symbol(); for(i=k-1; i>=0; i--){ // Начнем сразу с конца, чтобы получить первым же подходящим вариантом нужную сделку if((d=HistoryDealGetTicket(i))>0){ // Выберем сделку по номеру и получим её тикет if(HistoryDealGetString(d, DEAL_SYMBOL)==sy){ // Нужный нам символ if(HistoryDealGetInteger(d, DEAL_ENTRY)==DEAL_ENTRY_OUT){ // Убедимся, что этой сделкой совершался ВЫХОД ИЗ РЫНКА // (другими словами, закрытие позиции) if(op<0 || (op==0 && HistoryDealGetInteger(d, DEAL_TYPE)==DEAL_TYPE_SELL) // Если нужно закрытие покупки - то это продажа || (op==1 && HistoryDealGetInteger(d, DEAL_TYPE)==DEAL_TYPE_BUY)){ // Если нужно закрытие продажи - то это покупка if(mn<0 || HistoryDealGetInteger(d, DEAL_MAGIC)==mn) { // Номер советника t=(datetime)HistoryDealGetInteger(d, DEAL_TIME); Print("Нашли сделку ", d); break; }}}}}} // Получили время нужной сделки и вышли из цикла return(t>0?iBarShift(sy, tf, t, true):-1); } // Вернем номер бара или неудачу Edited September 24, 2018 by AntFX 1 Quote 1 Link to post Share on other sites
AntFX 6,474 Share Posted September 24, 2018 (edited) В 19.09.2018 в 04:33, torgf сказал: Спасибо, нашла . Можно, как нибудь, узнать первоначальный размер лота позиции закрытой по частям. Например лот 0.3 закрыт по рынку дважды 0.1 и 0.1, остаток закрылся по стоп лосс. Как узнать что был лот 0.3? Сначала нужно узнать номер позиции, для этого нужно получить свойство сделки HistoryDealGetInteger(DEAL_POSITION_ID) или свойство ордера HistoryOrderGetInteger(ORDER_POSITION_ID) Затем нужно выбрать историю этой позиции в ордерах и сделках HistorySelectByPosition(POSITION_ID), используя полученный номер Теперь можно выбирать сделки со свойством IN (то есть вход в рынок) и анализировать их объемы и последовательность. Ведь все может быть не так просто, как - сначала открыли 0.3, а потом закрывали по 0.1. А может быть, открывали 7 раз по 0.1, потом закрыли 3 раза по 0.2, потом открыли 2 раза по 0.3 и т.д. и все в пределах одной и той же позиции... В МТ5 "частичное открытие и закрытие" это более "простое" и естественное понятие, чем в МТ4 с его жесткой привязкой к ордерам. Edited September 24, 2018 by AntFX Quote 1 Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.