Как кодировать? - страница 50

 

Восстановление типа данных из индикатора

Здравствуйте

Возможно ли восстановить тип данных из индикатора (3 MA Cross w alert), чтобы поместить его в советник?

Вот что я хочу сделать:

В индикаторе (3 MA Cross w alert) я поместил тип данных :

double execute_trade = "ok_buy" или execute_trade = "ok_sell" здесь :

************Indicator ************

if ((fasterMAnow > slowerMAnow &&

fasterMAprevious <= slowerMAprevious &&

fasterMAafter > slowerMAafter &&

mediumMAnow > slowerMAnow )

||

(fasterMAnow > slowerMAnow &&

mediumMAnow > slowerMAnow &&

mediumMAprevious <= slowerMAprevious &&

mediumMAafter > slowerMAafter ))

{

CrossUp = Low - Range*0.5;

string execute_trade = "ok_buy";

}

if ((fasterMAnow < slowerMAnow &&

fasterMAprevious >= slowerMAprevious &&

fasterMAafter < slowerMAafter &&

mediumMAnow < slowerMAnow )

||

(fasterMAnow < slowerMAnow &&

mediumMAnow < slowerMAnow &&

mediumMAprevious >= slowerMAprevious &&

mediumMAafter < slowerMAafter ))

{

CrossDown = High + Range*0.5;

execute_trade = "ok_sell";

}

************************

и я хотел бы восстановить "excute_trade" в моем советнике следующим образом :

***********EA***************

if (excute_trade== "ok_buy")

Order = SIGNAL_BUY;

if (excute_trade== "ok_sell")

Ордер = СИГНАЛ_ПРОДАЖИ;

****************************

Но я не знаю, как сделать

помогите пожалуйста

С наилучшими пожеланиями

Файлы:
 
Julia:
Может ли кто-нибудь быть так добр и подсказать мне, как написать следующий код?

Если моя Ea включена на графике M30, я хочу, чтобы код говорил:

if(на таймфрейме M5 сегодняшнее закрытие>вчерашнее закрытие)

{

.........

}

Сегодняшнее закрытие - это текущий BID; вчерашнее закрытие не зависит от таймфрейма, поэтому не имеет значения таймфрейм M30 или M5.

if(Bid > iClose(NULL,PERIOD_D1,1))

{

...

}

 
natsirte:
Привет

Возможно ли восстановить тип данных из индикатора (3 MA Cross w alert), чтобы поместить его в советник?

Вот что я хочу сделать:

В индикаторе (3 MA Cross w alert) я поместил тип данных :

double execute_trade = "ok_buy" или execute_trade = "ok_sell" здесь :

************Indicator ************

if ((fasterMAnow > slowerMAnow &&

fasterMAprevious <= slowerMAprevious &&

fasterMAafter > slowerMAafter &&

mediumMAnow > slowerMAnow )

||

(fasterMAnow > slowerMAnow &&

mediumMAnow > slowerMAnow &&

mediumMAprevious <= slowerMAprevious &&

mediumMAafter > slowerMAafter ))

{

CrossUp = Low - Range*0.5;

string execute_trade = "ok_buy";

}

if ((fasterMAnow < slowerMAnow &&

fasterMAprevious >= slowerMAprevious &&

fasterMAafter < slowerMAafter &&

mediumMAnow < slowerMAnow )

||

(fasterMAnow < slowerMAnow &&

mediumMAnow < slowerMAnow &&

mediumMAprevious >= slowerMAprevious &&

mediumMAafter < slowerMAafter ))

{

CrossDown = High + Range*0.5;

execute_trade = "ok_sell";

}

************************

и я хотел бы восстановить "excute_trade" в моем советнике следующим образом :

***********EA***************

if (excute_trade== "ok_buy")

Order = SIGNAL_BUY;

if (excute_trade== "ok_sell")

Ордер = СИГНАЛ_ПРОДАЖИ;

****************************

Но я не знаю, как сделать

помогите пожалуйста

С наилучшими пожеланиями

Вы должны использовать функцию iCustom для получения значения буферов (т.е. стрелок);

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Вычисляет указанный пользовательский индикатор и возвращает его значение. Пользовательский индикатор должен быть скомпилирован (файл *.EX4) и находиться в каталоге terminal_directory\experts\indicators.

Параметры:

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

timeframe - Таймфрейм. Это может быть любое из значений перечисления Timeframe. 0 означает текущий таймфрейм графика.

name - Имя скомпилированной программы пользовательского индикатора.

... - Набор параметров (если необходимо). Передаваемые параметры и их порядок должны соответствовать порядку раскрытия и типу внешних переменных пользовательского индикатора.

mode - Индекс строки. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.

shift - Индекс значения, взятого из буфера индикатора (сдвиг относительно текущего бара на заданное количество периодов назад).

Пример:

double val=iCustom(NULL, 0, "SampleInd",13,1,0);

В вашем случае синтаксис должен быть следующим:

if(iCustom(NULL, 0, "3 MA Cross w_Alert v2", p1, , , , p10, 0, 0) > 0) // Buy

{

...

}

if(iCustom(NULL, 0, "3 MA Cross w_Alert v2", p1, , , , p10, 1, 0) > 0) // Sell

{

...

}

Параметры p1 - p10 - это значения, которые нужно передать индикатору в качестве внешних параметров. Например, p1 означает значение, которое будет присвоено FasterMA, p2 - FasterShift, и так далее до последнего внешнего объявления p10 SoundAlert. Смотрите код индикатора, чтобы узнать их порядок и значение.

 

Спасибо, Мишель.

Но что если код находится в коде индикатора?

Это:

if(Close[pos]>iHigh(Symbol(),PERIOD_M5,[pos+1])?????

 
Beno:
Gidday Я медленно исправляю ошибки в некоторых моих ea (и многому учусь по пути), но что это значит.

2007.10.24 21:22:24 1998.11.20 06:00 The Abyss GBPJPY,Daily: недопустимое двойное число в качестве параметра 6 для функции OrderSend

Я не могу найти ничего об этой ошибке, на что я должен обратить внимание.

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

Как вы можете видеть, параметр шесть - это стоплосс. Убедитесь, что ваш стоплосс определен как int. Далее, убедитесь, что в команде OrderSend() вы умножаете стоплосс на точку. Это преобразуется в правильное двойное значение для валюты, которой вы торгуете.

Пример для длинной позиции:

ticketa=OrderSend(Symbol(),OP_BUY,lotize,Ask,slip,Ask-intStopLoss*Point,Ask+intTakeProfit*Point, "Comment",magic,0,Green);

Пример для краткости:

ticketb=OrderSend(Symbol(),OP_SELL,lotize,Bid,slip,Bid+intStopLoss*Point,Bid-intTakeProfit*Point, "Comment",magic,0,Blue);

Надеюсь, это поможет.

 

Спасибо, Вульф.

Это очень помогло, но открыло новую проблему lol теперь он покупает, но не продает ну не в том месте. Я пытался купить, когда все три инди синие и продать, когда все красные.

Думаю, я выбрал правильное название "Бездна" для ea, так как именно там я и сижу, пытаясь найти выход. LOL

2007.11.24 10:14:44 2007.11.23 12:00 The Abyss EURUSD,H4: Ошибка при открытии ордера SELL: 0

void CheckForSignals() {

double TML=iCustom(NULL,0, "TrendManager",TM_Period,TM_Shift,0,shift);

double TMS=iCustom(NULL,0, "TrendManager",TM_Period,TM_Shift,1,shift);

double hasOpenLong=iCustom(NULL,0, "Heiken_Ashi_Smoothed",MaMetod,MaPeriod,MaPeriod2,1,shift) ;

double hasCloseLong=iCustom(NULL,0, "Heiken_Ashi_Smoothed",MaMetod,MaPeriod,MaPeriod2,3,shift) ;

double hasOpenShort=iCustom(NULL,0, "Heiken_Ashi_Smoothed",MaMetod,MaPeriod,MaPeriod2,0,shift) ;

double hasCloseShort=iCustom(NULL,0, "Heiken_Ashi_Smoothed",MaMetod,MaPeriod,MaPeriod2,2,shift) ;

double SDLL=iCustom(NULL,0, "Slope Direction Line",period,method,price,0,shift);

double SDLS=iCustom(NULL,0, "Slope Direction Line",period,method,price,1,shift);

buysig=false;

sellsig=false;

closebuy=false;

closesell=false;

bool Long1 = TML;

bool Short1 = TMS;

bool Long2 = SDLL;

bool Short2 = SDLS;

bool Long3 = hasOpenLong > hasCloseLong;

bool Short3 = hasOpenShort < hasCloseShort;

buysig = Long1 && Long2 && Long3;

sellsig = Short1 && Short2 && Short3;

closebuy=sellsig;

closesell=buysig;

}

void CheckForOpen() {

if (last==Time[0]) return;

int res,ord;

двойная запись, остановка;

ord=CalculateCurrentOrders();

if (ord!=0) CheckForClose();

//---- условия покупки

if (buys< buysig) {

res=OpenAtMarket(OP_BUY,Lots);

if (res<0) Print("Ошибка открытия ордера BUY : ",(GetLastError()));

else last=Time[0];

}

//---- условия продажи

if (sells< sellsig) {

res=OpenAtMarket(OP_SELL,Lots);

if (res<=0) Print("Ошибка открытия ордера SELL : ",(GetLastError()));

else last=Time[0];

}

}

int OpenAtMarket(int mode,double lot) {

int tr,col;

double openprice;

tr=0; while (tr<5 && !IsTradeAllowed()) { tr++; Sleep(2000); }

RefreshRates();

if (mode==OP_SELL) {

openprice=Bid;

col=Red;

} else {

//openprice=nd(Ask);

openprice=Ask;

col=Blue;

}

OrderSend(Symbol(),mode,lot,openprice,slippage,sl,tp,EAName+Magic,Magic,0,col);

}

return;

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

//| Проверка условий закрытия ордера |

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

void CheckForClose() {

int total;

//----

total=OrdersTotal();

for(int i=total;i>=0;i--)

{

if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;

//---- проверка типа ордера

if(OrderType()==OP_BUY && closebuy) CloseAtMarket(OrderTicket(),OrderLots());

if(OrderType()==OP_SELL && closesell) CloseAtMarket(OrderTicket(),OrderLots());

}

}

bool CloseAtMarket(int ticket,double lot) {

bool bres=false; int tr;

tr=0; while (tr<5 && !IsTradeAllowed()) { tr++; Sleep(2000); }

RefreshRates();

bres=OrderClose(ticket,lot,OrderClosePrice(),slippage,White);

if (!bres) Print("Ошибка закрытия ордера : ",(GetLastError()));

}

 
Julia:
Спасибо, Мишель.

Но что если код находится в коде индикатора?

Так ли это:

if(Close[pos]>iHigh(Symbol(),PERIOD_M5,[pos+1])?????

Да, это может быть так; все зависит от того, что вы собираетесь делать...

 

Помогите плз - конвертировать в Mq4 - спасибо большое

Уважаемые все:

Я строю систему я думаю, что это очень хорошо, я тестировал идею до 3 месяцев, Теперь я пытаюсь кодировать индикатор, который будет как можно скорее на форуме, так что мы можем проверить его, и это действительно будет делать хорошие деньги я думаю:

Plz помогите мне сейчас преобразовать эти строки в кодировку mql4:

1- У меня есть переменная X, у нее будет значение, и я вычисляю его сейчас.

SO У нас есть X как целое число

2- индикатор должен проверять текущее время по Гринвичу, оно должно быть 6:00 утра по Гринвичу - Таймфрейм 1 H

-- проверить GMT TIME 6:00 утра, КОГДА эта свеча закроется, нам нужно вычислить следующую переменную этой свечи:

High - Low = A

A / 2 = B

B - High = C = SL

D = X * 30%

Buy_Entry = D + C

Buy_Target = C + (X * 60%)

Продажа_вход = C - D

Цель продажи = C - (X * 60%)

Затем:

Я хочу отобразить результат в виде линий на графике с серой зоной для покупки и красной зоной для короткой позиции в соответствии с входом для покупки и продажи и SL

Они должны автоматически появляться, как только свеча GMT 6:00 закончится, таймфрейм 1H, поэтому расчет должен быть в соответствии с 6:00 до 6:59 утра GMT свечи high и low.

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

БОЛЬШОЕ СПАСИБО

 
Beno:
Спасибо, Вулф.

Это помогло многим, но открыло новую проблему lol теперь он покупает, но не продает, ну не в том месте. Я пытался купить, когда все три инди синие и продать, когда все красные.

Думаю, я выбрал правильное название "Бездна" для ea, поскольку именно там я и сижу, пытаясь найти выход. LOL

Бено, я не уверен насчет этого. Обычно у меня не было хорошего опыта использования индикаторов, меняющих цвет, в советниках. Откройте окно данных с подключенными индикаторами и выясните, какое числовое значение возвращается для каждого цвета. Это может помочь вам в кодировании, также убедитесь, что вы вызываете правильный буфер индикатора в нужное время. (Я уверен, что вы уже сделали это) Вам может повезти больше, если вы опубликуете весь советник, если вам действительно нужна помощь. Кроме того, лично я бы сделал 2 отдельные функции Ordersend(), одну для шортов, другую для лонгов. Это только мое мнение, так проще следить за ситуацией.

Удачи, у всех нас были свои собственные версии "бездны"!

 

Спасибо, Вульф.

Я собираюсь попробовать вариант с 2 Ordersend, чтобы посмотреть, что получится. Как только у меня все получится, я опубликую это.

Причина обращения: