STOP
STOP
Witam mam tu problem ze stopem może ktoś z was by wiedział gdzie popełniam błąd? całość działa mi dobrze prócz OrderClose, robot zachowuje się jakby nie było tej części kodu
void CheckForOpen()
{
int q;// określenie czasu rozpoczęcia transakcji
int res;// początek części kodu co działa
if(Volume[0]>1)
return;
if(Close[1]>Close[90])
{
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=WHCOrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();//q jest liczbą sekund od 1970 do otwarcia pozycji
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}//koniec części kodu co działa
if(OrderSelect(MAGICMA, SELECT_BY_TICKET)==true)// wybieram transakcje
{
if((TimeCurrent()-q)>180) // jeśli aktualny czas w sekundach - czas otwarcia pozycji > 180 sekund
{
OrderClose( MAGICMA,1,Ask,3,Red); // zamknij transakcje
}
}
}
Całość wygląda logicznie robot otwiera i zamyka transakcje gdy jest spełniony warunek po TP i SL a na czas już nie "zwraca uwagi"
void CheckForOpen()
{
int q;// określenie czasu rozpoczęcia transakcji
int res;// początek części kodu co działa
if(Volume[0]>1)
return;
if(Close[1]>Close[90])
{
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=WHCOrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();//q jest liczbą sekund od 1970 do otwarcia pozycji
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}//koniec części kodu co działa
if(OrderSelect(MAGICMA, SELECT_BY_TICKET)==true)// wybieram transakcje
{
if((TimeCurrent()-q)>180) // jeśli aktualny czas w sekundach - czas otwarcia pozycji > 180 sekund
{
OrderClose( MAGICMA,1,Ask,3,Red); // zamknij transakcje
}
}
}
Całość wygląda logicznie robot otwiera i zamyka transakcje gdy jest spełniony warunek po TP i SL a na czas już nie "zwraca uwagi"
Re: STOP
Kod: Zaznacz cały
void CheckForOpen()
{
int q;// określenie czasu rozpoczęcia transakcji
int res;// początek części kodu co działa
if(Volume[0]>1)
return;
if(Close[1]>Close[90])
{
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();//q jest liczbą sekund od 1970 do otwarcia pozycji
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}//koniec części kodu co działa
if(OrderSelect(OrderTicket(), SELECT_BY_TICKET)==true)// wybieram transakcje
{
if((TimeCurrent()-OrderOpenTime())>180) // jeśli aktualny czas w sekundach - czas otwarcia pozycji > 180 sekund
{
OrderClose( OrderTicket(),OrderLots(),Bid,3,Red); // zamknij transakcje
}
}
}
Spróbuj tego
Re: STOP
widzę że usunąłeś q i MAGICMA i zastąpiłeś to OrderTicket() i OrderOpenTime() też próbowałem podobną kombinacje ale uznałem że to nie jest zbyt jasne co jest co dla programu i dlatego to co podałeś zmodyfikowałem do mojej formy ale tak czy siak obydwa kody mi nie działają tak jak wspominałem wyżej tak jakby tych linijek kodu by nie było
Re: STOP
Tutaj miesza ten warunek :MŁA pisze:widzę że usunąłeś q i MAGICMA i zastąpiłeś to OrderTicket() i OrderOpenTime() też próbowałem podobną kombinacje ale uznałem że to nie jest zbyt jasne co jest co dla programu i dlatego to co podałeś zmodyfikowałem do mojej formy ale tak czy siak obydwa kody mi nie działają tak jak wspominałem wyżej tak jakby tych linijek kodu by nie było
Kod: Zaznacz cały
if(Volume[0]>1)
return;
Kod: Zaznacz cały
void CheckForOpen()
{
int q;// określenie czasu rozpoczęcia transakcji
// początek części kodu co działa
if(Volume[0]>1)
return;
if(Close[1]>Close[90])
{
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();//q jest liczbą sekund od 1970 do otwarcia pozycji
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}//koniec części kodu co działa
}
Kod: Zaznacz cały
int CLOSE(){
for (int p = OrdersTotal(); p >=0; p--) {
OrderSelect(p, SELECT_BY_POS, MODE_TRADES);{
if((TimeCurrent()- OrderOpenTime())>180){
if (OrderType() == OP_BUY && Symbol() == OrderSymbol() ) {OrderClose( OrderTicket(), OrderLots(), Bid, 1, Yellow);}
if (OrderType() == OP_SELL && Symbol() == OrderSymbol()) {OrderClose( OrderTicket(), OrderLots(), Ask, 1, Yellow);}
}
}
}
return(0);
}
-
- Stały bywalec
- Posty: 43
- Rejestracja: 22 gru 2016, 12:45
Re: STOP
Masz jakąś niestandardową funkcję OrderSend, ale prawdopodobnie zmienna MAGICMA nie przechowuje ticketu zlecenia tylko numer magic. Jeśli tak jest, to OrderSelect(MAGICMA, SELECT_BY_TICKET) oraz OrderClose(MAGICMA, ...) nie mogą zadziałać. Ticket ostatniego wysłanego zlecenia powinieneś mieć w zmiennej res.
Przy takim samodzielnym kombinowaniu bardzo przydaje się funkcja Print (albo debugger, ale moim zdaniem jest mniej wygodny do takich roboczych prób i błędów). Jak nie działa jakiś if, to możesz zrobić
Jeśli nie wchodzi do tego ifa, mimo że według założeń powinno, to można iść dalej i printować sam warunek i tak aż dojdziesz do tego, co konkretnie nie działa.
Pewnie jak zrobisz Print( OrderSelect(MAGICMA, SELECT_BY_TICKET) ), to nawet po wystawionym zleceniu będzie pokazywało "false" i wtedy już będziesz wiedział, że jest coś nie tak z tą funkcją.
Przy takim samodzielnym kombinowaniu bardzo przydaje się funkcja Print (albo debugger, ale moim zdaniem jest mniej wygodny do takich roboczych prób i błędów). Jak nie działa jakiś if, to możesz zrobić
Kod: Zaznacz cały
if(coś tam){
Print("Warunek jakiśtam został spełniony");
}
Pewnie jak zrobisz Print( OrderSelect(MAGICMA, SELECT_BY_TICKET) ), to nawet po wystawionym zleceniu będzie pokazywało "false" i wtedy już będziesz wiedział, że jest coś nie tak z tą funkcją.
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch
Re: STOP
I dalej mam zonk algorytm nie działa może przedstawie 100% kodu na jakim pracuje od razu mówię że to jest taki zlepek nad którym już jakiś czas pracuje który powstałe z tego https://www.mql5.com/en/articles/1385 na tej podstawie bawiłem się ze średnimi i z macd ale średnio to wychodziło . Kod który wrzuciłem poniżej rozumiem w jakimś 70-80% i właśnie nie wiem czy tych 20-30% nie ma czegoś co blokuje ten stop:
//+------------------------------------------------------------------+
//| Moving Average_Мodified.mq4 |
//| Copyright © 2013, MetaQuotes Software Corp. |
//| Modified by BARS |
//+------------------------------------------------------------------+
#define MAGICMA 20050610
//-----------------------------------------
extern int StopLoss = 500;
extern int TakeProfit = 500;
extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern color BuyColor = clrCornflowerBlue;
extern color SellColor = clrSalmon;
extern double pips =0.01;
int q;
//---
double SL=0,TP=0;
//-- Include modules --
#include <stderror.mqh>
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void start()
{
//--- If there are more than 100 bars in the chart and the trade flow is free
if(Bars<100 || IsTradeAllowed()==false)
return;
//--- If the calculated lot size is in line with the current deposit amount
if(CalculateCurrentOrders(Symbol())==0)
CheckForOpen(); // start working
else
CheckForClose(); // otherwise, close positions
}
//+------------------------------------------------------------------+
//| Determines open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0)
return(buys);
else
return(-sells);
}
//+------------------------------------------------------------------+
//| Calculates the optimum lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of loss orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of loss orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//----
if(OrderProfit()>0)
break;
if(OrderProfit()<0)
losses++;
}
if(losses>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1)
lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+
//| Position opening function |
//+------------------------------------------------------------------+
void CheckForOpen()
{
int res;
if(Volume[0]>1)
return;
//open sell
if(Close[1]>Close[90]
//-----filtry
)
{
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=WHCOrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}
}
int CLOSE(){
for (int p = OrdersTotal(); p >=0; p--) {
OrderSelect(p, SELECT_BY_POS, MODE_TRADES);{
if((TimeCurrent()- OrderOpenTime())>18000){
if (OrderType() == OP_BUY && Symbol() == OrderSymbol() ) {OrderClose( OrderTicket(), OrderLots(), Bid, 1, Yellow);}
if (OrderType() == OP_SELL && Symbol() == OrderSymbol()) {OrderClose( OrderTicket(), OrderLots(), Ask, 1, Yellow);}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| Position closing function |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma;
//---- go trading only for first tiks of new bar
//(start working at the first tick of the new bar)
if(Volume[0]>1) return;
//---- get Moving Average
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Open[1]>ma && Close[1]<ma)
OrderClose(OrderTicket(),OrderLots(),Bid,3,BuyColor); break;
}
if(OrderType()==OP_SELL)
{
if(Open[1]<ma && Close[1]>ma)
OrderClose(OrderTicket(),OrderLots(),Ask,3,SellColor); break;
}
}
}
//+-------------------------------------------------------------------+
//| Opens positions in Market Execution mode |
//+-------------------------------------------------------------------+
int WHCOrderSend(string symbol,
int cmd,
double volume,
double price,
int slippage,
double stoploss,
double takeprofit,
string comment,
int magic,
datetime expiration,
color arrow_color)
{
int ticket=OrderSend(symbol,cmd,volume,price,slippage,0,0,comment,magic,expiration,arrow_color);
int check=-1;
if(ticket>0 && (stoploss!=0 || takeprofit!=0))
{
if(!OrderModify(ticket,price,stoploss,takeprofit,expiration,arrow_color))
{
check=GetLastError();
if(check!=ERR_NO_MQLERROR)
Print("OrderModify error: ",ErrorDescription(check));
}
}
else
{
check=GetLastError();
if(check!=ERR_NO_ERROR)
Print("OrderSend error: ",ErrorDescription(check));
}
return(ticket);
}
//+------------------------------------------------------------------+
TesterForex'ie MAGICMA jest zadeklarowane na samym początku kodu a w jaki sposób używasz tego if od print? bo ja biorę robota i wrzucam w optymalizacje co mi wypluwa optymalizator otwieram na wykresie i patrze co się dzieje
//+------------------------------------------------------------------+
//| Moving Average_Мodified.mq4 |
//| Copyright © 2013, MetaQuotes Software Corp. |
//| Modified by BARS |
//+------------------------------------------------------------------+
#define MAGICMA 20050610
//-----------------------------------------
extern int StopLoss = 500;
extern int TakeProfit = 500;
extern double Lots = 0.1;
extern double MaximumRisk = 0.02;
extern double DecreaseFactor = 3;
extern color BuyColor = clrCornflowerBlue;
extern color SellColor = clrSalmon;
extern double pips =0.01;
int q;
//---
double SL=0,TP=0;
//-- Include modules --
#include <stderror.mqh>
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void start()
{
//--- If there are more than 100 bars in the chart and the trade flow is free
if(Bars<100 || IsTradeAllowed()==false)
return;
//--- If the calculated lot size is in line with the current deposit amount
if(CalculateCurrentOrders(Symbol())==0)
CheckForOpen(); // start working
else
CheckForClose(); // otherwise, close positions
}
//+------------------------------------------------------------------+
//| Determines open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0)
return(buys);
else
return(-sells);
}
//+------------------------------------------------------------------+
//| Calculates the optimum lot size |
//+------------------------------------------------------------------+
double LotsOptimized()
{
double lot=Lots;
int orders=HistoryTotal(); // history orders total
int losses=0; // number of loss orders without a break
//---- select lot size
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of loss orders without a break
if(DecreaseFactor>0)
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//----
if(OrderProfit()>0)
break;
if(OrderProfit()<0)
losses++;
}
if(losses>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//---- return lot size
if(lot<0.1)
lot=0.1;
return(lot);
}
//+------------------------------------------------------------------+
//| Position opening function |
//+------------------------------------------------------------------+
void CheckForOpen()
{
int res;
if(Volume[0]>1)
return;
//open sell
if(Close[1]>Close[90]
//-----filtry
)
{
SL=0;TP=0;
if(StopLoss>0)
SL=Ask-Point*StopLoss;
if(TakeProfit>0)
TP=Ask+Point*TakeProfit;
res=WHCOrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,SL,TP,"MACD",MAGICMA,0,BuyColor);
q=TimeCurrent();
if(res<0)
{
Print("Error when opening a BUY order #",GetLastError());
Sleep(10000);
return;
}
}
}
int CLOSE(){
for (int p = OrdersTotal(); p >=0; p--) {
OrderSelect(p, SELECT_BY_POS, MODE_TRADES);{
if((TimeCurrent()- OrderOpenTime())>18000){
if (OrderType() == OP_BUY && Symbol() == OrderSymbol() ) {OrderClose( OrderTicket(), OrderLots(), Bid, 1, Yellow);}
if (OrderType() == OP_SELL && Symbol() == OrderSymbol()) {OrderClose( OrderTicket(), OrderLots(), Ask, 1, Yellow);}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| Position closing function |
//+------------------------------------------------------------------+
void CheckForClose()
{
double ma;
//---- go trading only for first tiks of new bar
//(start working at the first tick of the new bar)
if(Volume[0]>1) return;
//---- get Moving Average
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
if(Open[1]>ma && Close[1]<ma)
OrderClose(OrderTicket(),OrderLots(),Bid,3,BuyColor); break;
}
if(OrderType()==OP_SELL)
{
if(Open[1]<ma && Close[1]>ma)
OrderClose(OrderTicket(),OrderLots(),Ask,3,SellColor); break;
}
}
}
//+-------------------------------------------------------------------+
//| Opens positions in Market Execution mode |
//+-------------------------------------------------------------------+
int WHCOrderSend(string symbol,
int cmd,
double volume,
double price,
int slippage,
double stoploss,
double takeprofit,
string comment,
int magic,
datetime expiration,
color arrow_color)
{
int ticket=OrderSend(symbol,cmd,volume,price,slippage,0,0,comment,magic,expiration,arrow_color);
int check=-1;
if(ticket>0 && (stoploss!=0 || takeprofit!=0))
{
if(!OrderModify(ticket,price,stoploss,takeprofit,expiration,arrow_color))
{
check=GetLastError();
if(check!=ERR_NO_MQLERROR)
Print("OrderModify error: ",ErrorDescription(check));
}
}
else
{
check=GetLastError();
if(check!=ERR_NO_ERROR)
Print("OrderSend error: ",ErrorDescription(check));
}
return(ticket);
}
//+------------------------------------------------------------------+
TesterForex'ie MAGICMA jest zadeklarowane na samym początku kodu a w jaki sposób używasz tego if od print? bo ja biorę robota i wrzucam w optymalizacje co mi wypluwa optymalizator otwieram na wykresie i patrze co się dzieje
-
- Stały bywalec
- Posty: 43
- Rejestracja: 22 gru 2016, 12:45
Re: STOP
Ok, MAGICMA to numer magic, a to nie jest to samo co ticket. Ale to już poprawiłeś zgodnie z tym co pisał Jarek.
Masz błąd w funkcji CheckForClose():
Deklarujesz zmienną ma, ale potem nie przypisujesz jej żadnej wartości. Dopóki nie wyliczysz wartości średniej (funkcja iMA), to w zmiennej ma prawdopodobnie będzie 0. Dlatego warunki Open[1]>ma && Close[1]<ma oraz Open[1]<ma && Close[1]>ma nigdy nie będą spełnione.
Co do printa, to umieszczasz go w wybranym miejscu w kodzie, odpalasz robota na jakimś wykresie, wchodzisz w zakładkę "Strategie/Experts" i patrzysz czy pojawia się tam tekst z funkcji Print i co to za tekst. Dzięki temu możesz w prosty sposób przekonać się co robot w danym momencie widzi. Dodałem printy do tej funkcji, żebyś zobaczył o co chodzi.
Masz błąd w funkcji CheckForClose():
Deklarujesz zmienną ma, ale potem nie przypisujesz jej żadnej wartości. Dopóki nie wyliczysz wartości średniej (funkcja iMA), to w zmiennej ma prawdopodobnie będzie 0. Dlatego warunki Open[1]>ma && Close[1]<ma oraz Open[1]<ma && Close[1]>ma nigdy nie będą spełnione.
Kod: Zaznacz cały
void CheckForClose()
{
double ma;
//---- go trading only for first tiks of new bar
//(start working at the first tick of the new bar)
if(Volume[0]>1) return;
//---- get Moving Average
//Tu mogłeś coś przez pomyłkę skasować
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY)
{
Print("wartosc zmiennej ma: ", ma);
if(Open[1]>ma && Close[1]<ma)
OrderClose(OrderTicket(),OrderLots(),Bid,3,BuyColor); break;
}
if(OrderType()==OP_SELL)
{
Print("wartosc zmiennej ma: ", ma);
if(Open[1]<ma && Close[1]>ma)
OrderClose(OrderTicket(),OrderLots(),Ask,3,SellColor); break;
}
}
}
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch
Re: STOP
Dzięki że zająłeś się "moim" kodem tylko ta część kodu którą analizowałeś to pozostałość po wzorze z linku który wrzuciłem zostawiłem to z prostej przyczyny algorytm działa to dobrze jak coś skasuje to może przestać działać bardziej mi chodzi o ten stop czasowy :
int CLOSE(){
for (int p = OrdersTotal(); p >=0; p--) {
OrderSelect(p, SELECT_BY_POS, MODE_TRADES);{
if((TimeCurrent()- OrderOpenTime())>18000){
if (OrderType() == OP_BUY && Symbol() == OrderSymbol() ) {OrderClose( OrderTicket(), OrderLots(), Bid, 1, Yellow);}
if (OrderType() == OP_SELL && Symbol() == OrderSymbol()) {OrderClose( OrderTicket(), OrderLots(), Ask, 1, Yellow);}
}
}
}
return(0);
}
ogólnie z tego wzoru z linku można zbudować wiele https://www.mql5.com/en/articles/1385 tylko są pewne niuanse w kilku aspektach programowania które jak mi się wydaje są specyficzne dla mql4 oczywiście to może z wynikać z mojej niewiedzy bo mam bardzo skromne doświadczenie w delphi, c++ i HTML z przed wielu lat
reasumując w algorytmie o to mi chodzi: jesli Close[1]>Close[90] otwórz i jesli w 18000 sekund nie dojdzie do tp lub sl to zamknij
int CLOSE(){
for (int p = OrdersTotal(); p >=0; p--) {
OrderSelect(p, SELECT_BY_POS, MODE_TRADES);{
if((TimeCurrent()- OrderOpenTime())>18000){
if (OrderType() == OP_BUY && Symbol() == OrderSymbol() ) {OrderClose( OrderTicket(), OrderLots(), Bid, 1, Yellow);}
if (OrderType() == OP_SELL && Symbol() == OrderSymbol()) {OrderClose( OrderTicket(), OrderLots(), Ask, 1, Yellow);}
}
}
}
return(0);
}
ogólnie z tego wzoru z linku można zbudować wiele https://www.mql5.com/en/articles/1385 tylko są pewne niuanse w kilku aspektach programowania które jak mi się wydaje są specyficzne dla mql4 oczywiście to może z wynikać z mojej niewiedzy bo mam bardzo skromne doświadczenie w delphi, c++ i HTML z przed wielu lat

-
- Stały bywalec
- Posty: 43
- Rejestracja: 22 gru 2016, 12:45
Re: STOP
Ok, jeżeli chodziło o CLOSE(), to problem był z tym, że nie wywoływałeś tej funkcji. Sama funkcja jest ok i działa. Musisz ją wywołać w start():
Generalnie program program mql działa tak, że masz funkcję główną, która jest wywoływana przez jakieś wydarzenie (nowy tick, uruchomienie programu, upływ czasu itp.) i w niej musisz umieszczać to co ma się wykonać.
Kod: Zaznacz cały
void start()
{
//--- If there are more than 100 bars in the chart and the trade flow is free
if(Bars<100 || IsTradeAllowed()==false)
return;
//--- If the calculated lot size is in line with the current deposit amount
if(CalculateCurrentOrders(Symbol())==0)
CheckForOpen(); // start working
else
CLOSE(); // otherwise, close positions
}
Generalnie program program mql działa tak, że masz funkcję główną, która jest wywoływana przez jakieś wydarzenie (nowy tick, uruchomienie programu, upływ czasu itp.) i w niej musisz umieszczać to co ma się wykonać.
Współautor interaktywnego kursu MQL4 dla serwisu fxwatch