bool InitialTPFibo(const string sSymbol, const int nTP = 0)
{
// возвращаемое значение, указывающее на успешность выполнения функции
bool bRetVal = false;
if(PositionSelect(sSymbol) == true)
{
// параметры открытой позиции, к которой нужно выставить ТП
ENUM_POSITION_TYPE ePositionType = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);
double fOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
double fTP = PositionGetDouble(POSITION_TP);
double fPoint = SymbolInfoDouble(sSymbol, SYMBOL_POINT);
int nDigits=(int) SymbolInfoInteger(sSymbol,SYMBOL_DIGITS);
double fLow[],fHigh[]; // Создадим массив значение Low/High
CopyLow(_Symbol,_Period,0,5,fLow); //Cкопируем в него текущее значение Low
ArraySetAsSeries(fLow,true); //Доступ к скопированным данным как к таймсериям
CopyHigh(_Symbol,_Period,0,5,fHigh);//Cкопируем в него текущее значение High
ArraySetAsSeries(fHigh,true); //Доступ к скопированным данным как к таймсериям
datetime fTime[]; //Создадим массив время открытия для последних баров
CopyTime(Symbol(),0,0,5,fTime); //Скопируем время открытия
ArraySetAsSeries(fTime,true); //Доступ к скопированным данным как к таймсериям
//hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
double fleve = ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,1); // это дает уровень Фибо-объекта
double fiboprice = ObjectGetDouble(0,"Fibo",OBJPROP_PRICE,1); //это дает цену на уровне Фибо-объекта
if(fTP > 0 || nTP == 0) // если ТП и СЛ уже выставлены, или же не требуются, то выходим
return(false);
double fNewTP = 0;
if(ePositionType == POSITION_TYPE_BUY)
{
double price1=fHigh[3];//--- координаты первой точки привязки Фибо-объекта
datetime time1=fTime[3];
double price2=fLow[1];//--- координаты первой точки привязки Фибо-объекта
datetime time2=fTime[1];
bool created=ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект
if(fTP > 0)
fNewTP = fTP;
else
{
if(nTP > 0)
fNewTP = fOpenPrice + nTP ;////////////// * fPoint;???????????????
}
}
if(ePositionType == POSITION_TYPE_SELL)
{
double price1=fHigh[1];//--- координаты первой точки привязки Фибо-объекта
datetime time1=fTime[1];
double price2=fLow[3];//--- координаты первой точки привязки Фибо-объекта
datetime time2=fTime[3];
bool created=ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объек
if(fTP > 0)
fNewTP = fTP;
else
{
if(nTP > 0)
fNewTP = fOpenPrice - nTP ;////////////////* fPoint;??????????????????
if(fNewTP < 0)
fNewTP = 0;
}
}
// запрос
Alexander Antoshkin:
Люди, как найти значения цены на линейки фибо для ТП например 160 ?
цена1 - (цена1 - цена2) / 100 * 160
где цена1 и цена2 - точки привязки фибо
double fleve = ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,1); // это дает уровень Фибо-объекта
double fiboprice = ObjectGetDouble(0,"Fibo",OBJPROP_PRICE,1); //это дает цену на уровне Фибо-объекта
bool created=ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект
достаточно знать цену у бара..
В таком варианте по вашей логике для Buy
fNewTP = (fHigh[3]-((fHigh[3]-fLow[1]))/100 )*168 ;
Проверяем это условие в тестере......
что то не то в этой формуле...
что то не то в этой формуле...
а так?
цена точки 0% - (цена точки 0% - цена точки 100%) / 100 * 168
пс. а зачем вы добавили общие скобки?
(fHigh[3]-((fHigh[3]-fLow[1]))/100 )*168
а так?
цена точки 0% - (цена точки 0% - цена точки 100%) / 100 * 168
пс. а зачем вы добавили общие скобки?
(fHigh[3]-((fHigh[3]-fLow[1]))/100 )*168
Умножаем на разницу между ценами нулевого и первого уровней /100 и прибавляем к цене нулевого уровня....
тогда все сходится с тестером
чтобы отобразить линейку в советнике набросал две функции
// ================================
bool FiboSell()
{
bool bSignal=false;
double fLow[],fHigh[]; // Создадим массив значение Low/High
CopyLow(_Symbol,_Period,0,5,fLow); //Cкопируем в него текущее значение Low
ArraySetAsSeries(fLow,true); //Доступ к скопированным данным как к таймсериям
CopyHigh(_Symbol,_Period,0,5,fHigh);//Cкопируем в него текущее значение High
ArraySetAsSeries(fHigh,true); //Доступ к скопированным данным как к таймсериям
datetime fTime[]; //Создадим массив время открытия для последних баров
CopyTime(Symbol(),0,0,5,fTime); //Скопируем время открытия
ArraySetAsSeries(fTime,true); //Доступ к скопированным данным как к таймсериям
double price1=fLow[1];//--- координаты первой точки привязки Фибо-объекта
datetime time1=fTime[1];
double price2= fHigh[3];//--- координаты первой точки привязки Фибо-объекта
datetime time2=fTime[3];
ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект
return(bSignal);
}
// ================================
bool FiboBuy()
{
bool bSignal=false;
double fLow[],fHigh[]; // Создадим массив значение Low/High
CopyLow(_Symbol,_Period,0,5,fLow); //Cкопируем в него текущее значение Low
ArraySetAsSeries(fLow,true); //Доступ к скопированным данным как к таймсериям
CopyHigh(_Symbol,_Period,0,5,fHigh);//Cкопируем в него текущее значение High
ArraySetAsSeries(fHigh,true); //Доступ к скопированным данным как к таймсериям
datetime fTime[]; //Создадим массив время открытия для последних баров
CopyTime(Symbol(),0,0,5,fTime); //Скопируем время открытия
ArraySetAsSeries(fTime,true); //Доступ к скопированным данным как к таймсериям
double price1=fHigh[3];//--- координаты первой точки привязки Фибо-объекта
datetime time1=fTime[3];
double price2=fLow[1];//--- координаты первой точки привязки Фибо-объекта
datetime time2=fTime[1];
ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект
return(bSignal);
}
Она абсолютно не нужна и служит лишь для этого теста
вызываю ее при установке ордера FiboSell(); FiboSell(); и и удаляю кода сделки нет ObjectsDeleteAll(0,0,OBJ_FIBO);
пишу функцию пытаюсь отрисовать линейку
в данном случае мне нужен первый верхний и первый нижний фрактал
что в функции не так, почму не устанавливает?
{
bool bSignal=false;
int g_Fractal=iFractals(_Symbol, _Period);
double Ups[],Downs[];// фракал
datetime Time[];
CopyBuffer(g_Fractal,0,0,10,Ups);
CopyBuffer(g_Fractal,0,0,10,Downs);
CopyTime(_Symbol,_Period,0,10,Time);
//--- установим для массивов признак таймсерии
ArraySetAsSeries(Ups,true);
ArraySetAsSeries(Downs,true);
ArraySetAsSeries(Time,true);
double price1=Ups[1];//--- координаты первой точки привязки Фибо-объекта
datetime time1=Time[3];
double price2=Downs[1];//--- координаты первой точки привязки Фибо-объекта
datetime time2=Time[10];
ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект
return(bSignal);
}
Скорее всего там пустые значения. Фракталы нужно еще найти.
в Ups[1] и Downs[1] есть цена?
Скорее всего там пустые значения. Фракталы нужно еще найти.
по идеи в Ups[1] и Downs[1] должна быть цена найденная индикатором фрактала..... или я что то не правильно понял?
например:
int priceUps; // это количество штуковин High индикатора фрактал
int priceDowns;// это количество штуковин Low индикатора фрактал
priceUps = CopyBuffer(g_Fractal,0,0,10,Ups); // скопировали 10 десять значений фрактала High
priceDowns= CopyBuffer(g_Fractal,0,0,10,Downs);// скопировали 10 десять значений нижнего фрактала Low
по идеи в Ups[1] и Downs[1] должна быть цена найденная индикатором фрактала..... или я что то не правильно понял?
в буферах будут значения последних 10-ти баров,
если на баре 1 нет фрактала, то в буфере [1] будет пустое значение (или ноль),
если на баре 1 есть фрактал, тогда в этой ячейке будет цена где установлен фрактал
То есть нужно перебирать массивы (Ups Downs) в поисках последних (крайних) фракталов - верхнего и нижнего.
в буферах будут значения последних 10-ти баров,
если на баре 1 нет фрактала, то в буфере [1] будет пустое значение (или ноль),
если на баре 1 есть фрактал, тогда в этой ячейке будет цена где установлен фрактал
То есть нужно перебирать массивы (Ups Downs) в поисках последних (крайних) фракталов - верхнего и нижнего.
Вы можете просто написать пример и расписать по строчно функцию
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Задача ,поставить тейк по уровням фибо , переделать готовую функцию
Условие:
если открылась покупка , берем хай третей свечи -это первая координата для фибо ,вторая координата лоу перовой свечи
если открылась продажа , лоу первой свечи -это первая координата , хай третей - вторая
input uint i_nSL = 20;
input uint i_nTP = 168;
bool InitialSLTP(const string sSymbol, const int nSL = 0, const int nTP = 0)
{
// возвращаемое значение, указывающее на успешность выполнения функции
bool bRetVal = false;
if(PositionSelect(sSymbol) == true)
{
// параметры открытой позиции, к которой нужно выставить СЛ и (или) ТП
ENUM_POSITION_TYPE ePositionType = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);
double fOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
double fSL = PositionGetDouble(POSITION_SL);
double fTP = PositionGetDouble(POSITION_TP);
double fPoint = SymbolInfoDouble(sSymbol, SYMBOL_POINT);
int nDigits = (int) SymbolInfoInteger(sSymbol, SYMBOL_DIGITS);
// если ТП и СЛ уже выставлены, или же не требуются, то выходим
if((fTP > 0 || nTP == 0) && (fSL > 0 || nSL == 0))
return(false);
// цена самой первой сделки позиции (цена её открытия) - от неё откладываем СЛ и ТП
double fFirstDealPrice = 0;
if(HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER)) == true)
{
int nTotalDeals = HistoryDealsTotal();
ulong nDealTicket = HistoryDealGetTicket(0);
fFirstDealPrice = HistoryDealGetDouble(nDealTicket, DEAL_PRICE);
}
double fNewSL = 0;
double fNewTP = 0;
if(ePositionType == POSITION_TYPE_BUY)
{
if(fSL > 0)
fNewSL = fSL;
else
{
if(nSL > 0)
fNewSL = fFirstDealPrice - nSL * fPoint;
if(fNewSL < 0)
fNewSL = 0;
}
if(fTP > 0)
fNewTP = fTP;
else
{
if(nTP > 0)
fNewTP = fOpenPrice + nTP * fPoint;
}
}
if(ePositionType == POSITION_TYPE_SELL)
{
if(fSL > 0)
fNewSL = fSL;
else
{
if(nSL > 0)
fNewSL = fOpenPrice + nSL * fPoint;
}
if(fTP > 0)
fNewTP = fTP;
else
{
if(nTP > 0)
fNewTP = fOpenPrice - nTP * fPoint;
if(fNewTP < 0)
fNewTP = 0;
}
}
// запрос
MqlTradeRequest oRequest = {0};
MqlTradeResult oResult = {0};
oRequest.action = TRADE_ACTION_SLTP;
oRequest.symbol = sSymbol;
oRequest.sl = NormalizeDouble(fNewSL, nDigits);
oRequest.tp = NormalizeDouble(fNewTP, nDigits);
// проверка перед отправкой
MqlTradeCheckResult oCheckResult= {0};
bool bCheck = OrderCheck(oRequest, oCheckResult);
Print("Проверка заявки InitialSLTP:",
" OrderCheck = ", bCheck,
", retcode = ", oCheckResult.retcode,
", balance = ", NormalizeDouble(oCheckResult.balance, 2),
", equity = ", NormalizeDouble(oCheckResult.equity, 2),
", margin = ", NormalizeDouble(oCheckResult.margin, 2),
", margin_free = ", NormalizeDouble(oCheckResult.margin_free, 2),
", margin_level = ", NormalizeDouble(oCheckResult.margin_level, 2),
", comment = ", oCheckResult.comment);
// если проверка удачная - отправка заявки
if(bCheck == true && oCheckResult.retcode == 0)
{
bool bResult = false;
// 3 попытки изменения позиции с интервалом 250 мс.
for(int k = 0; k < 3; k++)
{
bResult = OrderSend(oRequest, oResult);
if(bResult == true && oResult.retcode == TRADE_RETCODE_DONE)
break;
if(k == 2)
break;
Sleep(1000);
}
Print("Отправка заявки:",
" OrderSend = ", bResult,
", retcode = ", oResult.retcode,
", deal = ", oResult.deal,
", order = ", oResult.order,
", volume = ", NormalizeDouble(oResult.volume, 2),
", price = ", NormalizeDouble(oResult.price, _Digits),
", bid = ", NormalizeDouble(oResult.bid, _Digits),
", ask = ", NormalizeDouble(oResult.ask, _Digits),
", comment = ", oResult.comment,
", request_id = ",oResult.request_id);
if(oResult.retcode == TRADE_RETCODE_DONE)
bRetVal = true;
}
}
return (bRetVal);
}