Problem #1:
if(TimeCurrent() == Time[0])
This will be true ONLY if the first tick of the new bar arrives while TimeCurrent() is at 0 seconds.
Improvement:
static int oldBarTime;
if(oldBarTime != Time[0]){
oldBarTime = Time[0];
... continue with your code
.
.
Problem #2
for (cnt=total;cnt>0;cnt--)
If there is one order you will not see it, it will be in position 0 in the pool of orders.
Improvement:
for(cnt = OrdersTotal()-1; cnt >= 0; cnt--)
.
.
Problem #3
if(OrderType() <= OP_SELL==true || OrderType() <= OP_BUY==true)
This syntax looks goofy.
Improvement:
if(OrderType() == OP_SELL || OrderType() == OP_BUY)
.
.
Problem #4
You can't close both buy and sell orders using Ask for the price.
OrderClose(OrderTicket(),OrderLots(),Ask,5,CLR_NONE); //Close Orders
This calls for a change in Problem #3 to seprately address closure of OP_BUY and OP_SELL orders.
.
.
Problem #5
NormalizeDouble(LStopLose,4);
Useage of NormalizeDouble. The normalized value is returned from the call.
Improvment:
lStopLose = NormalizeDouble(LStopLose,4);
repeat for other instances.
.
.
Problem #6
You are using return(0) haphazardly. return(0) inside start() causes your progam to immediately exit (until the next tick restarts the code)
You probably want to remove all of them inside start() except at the very end.
.
.
Problem #7
cnt=0;
Why are you forcibly resetting the loop counter?
.
.
Overall Logic:
If a new bar is detected, close all existing positions.
Open a new Buy position if CCI is rising.
Open a new Sell position if CCI is falling.
.
.
There may be more problems not yet visible.
.
Please use the SRC button here in this editor to format your code
Been trying to get an EA to work right for 2 weeks now. nothing i try works. if i get the close to work, it wont open, if i get the open to work, it wont close. every code bit that i try to get it to work on a new bar only either does not work or runs multiple times....
Well, that occurs because you haven't learned how to write code yet.
Write a little piece at a time, and TEST IT to see if it works, and see if it works as you think it should work, then write a little more and TEST IT AGAIN.
Don't try to write the whole program at one time.
Example, you are trying to detect a new bar, and are failing.
Write only that, and get it to work, before you move on. It will save a lot of frustration.
Thanks for the help, the alert bit was infinitely useful
It was the returns i think that were killing it and seperating the closing out section. Everything seems to be working except this bit:
Problem #1:
if(TimeCurrent() == Time[0])
This will be true ONLY if the first tick of the new bar arrives while TimeCurrent() is at 0 seconds.
Improvement:
static int oldBarTime;
if(oldBarTime != Time[0]){
oldBarTime = Time[0];
... continue with your code
i put in an alert with it so I know it is running it, but it is running the whole EA every few seconds, but it seems to be random, not lining up with ticks or any pattern that i can see.
The start() function of an EA is called on every tick of the chart to which it is attached
static int oldBarTime;
if(oldBarTime != Time[0]){
oldBarTime = Time[0];
... continue with your code here
}
Check the brackets {} in what you wrote.
so i've been messing around with the new bar detecter thing, found this...
when i change this:
static int oldBarTime;
if(oldBarTime != Time[0]){
Alert("new bar");
oldBarTime = Time[0];
... continue with your code
to
static int oldBarTime;
oldBarTime = Time[0]; //new bit
if(oldBarTime != Time[0]){
Alert("new bar");
oldBarTime = Time[0];
... continue with your code
the EA will still run. I know it is looking at it as it prints the new bar alert, but it seems to be completely ignoreing the oldBarTime rule.
Ok, have fun experimenting. Have a nice day.
I've got something that has some potential:
int vol;
vol = 1;
if (iVolume(NULL,0,0) == vol )
{
Alert("new bar");
vol = 0;
...continue
this should start the EA on the first tick of a new bar, then stop it due to changin of vol...
phy already gave you the answer that virtually everyone uses when they only want to run logic at the formation of a new bar. Trust him, it works. If it isn't working for you, then you messed up somewhere.
datetime currTime; datetime prevTime; int start() { currTime=Time[0]; if(currTime!=prevTime) { prevTime = currTime; // ALL OF YOUR LOGIC GOES HERE!!!!!!!!!!!! } return(0); }
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Been trying to get an EA to work right for 2 weeks now. nothing i try works. if i get the close to work, it wont open, if i get the open to work, it wont close. every code bit that i try to get it to work on a new bar only either does not work or runs multiple times....
This code is no where near what I started with. Everytime it would not work, I removed something to make it simpler to try and find my error. If there is anyone who can throw me a bone and help me get this to work...Thank you
int start()
{
//---------------------------------------------------------------------------------------------------------------------------+
double CCI_ONE = iCCI(NULL,0,3,PRICE_CLOSE,1);// CCI one period ago
double CCI_TWO = iCCI(NULL,0,3,PRICE_CLOSE,2);// CCI two periods ago
int cnt, total;
total = OrdersTotal();
// Stop Loses----------------------------------------------------------------------------------------------------------------+
double LStopLose = iOpen(NULL, 0,0) - (iATR(NULL, 0, 5, 1) * 1.5);
double SStopLose = iOpen(NULL, 0,0) + (iATR(NULL, 0, 5, 1) * 1.5);
NormalizeDouble(LStopLose,4);
NormalizeDouble(SStopLose,4);
// Take Profits--------------------------------------------------------------------------------------------------------------+
double LTakeProfit = iOpen(NULL, 0,0) + (iATR(NULL, 0, 5, 1) * 2);
double STakeProfit = iOpen(NULL, 0,0) - (iATR( NULL, 0, 5, 1) * 2);
NormalizeDouble(LTakeProfit,4);
NormalizeDouble(STakeProfit,4);
//---------------------------------------------------------------------------------------------------------------------------+
if(TimeCurrent() == Time[0])
{
Alert("new bar");
for (cnt=total;cnt>0;cnt--)
{
OrderSelect(cnt,SELECT_BY_POS);
if(OrderType() <= OP_SELL==true || OrderType() <= OP_BUY==true)
{
OrderClose(OrderTicket(),OrderLots(),Ask,5,CLR_NONE); //Close Orders
cnt=0;
return(0);
}
return(0); //end of close orders
}
//---------------------------------------------------------------------------------------------------------------------------+
if ((CCI_ONE > CCI_TWO))
{
OrderSend(Symbol(),OP_SELL,1,Bid,5,SStopLose,STakeProfit,"Short Open 0-3",654321,0,White); //Open Short Order
return(0);//end of sell
}
//---------------------------------------------------------------------------------------------------------------------------+
if ((CCI_ONE < CCI_TWO))
{
OrderSend(Symbol(),OP_BUY,1,Ask,5,LStopLose,LTakeProfit,"Long Open 0-3",123456,0,White); //Open Long Order-------------+
return(0);//end of buy
}
return(0);
}
return(0);//end of EA
}